From the Zi Xuan School to submit records there, easy to understand, not those strange things ...
#include <cstdio> #include <cstring>const int maxn=100000,d=50;int n,str[maxn+d];int SA[MAXN+D],RANK[MAXN +d],height[maxn+d];int p[maxn+d],temp[maxn+d],cnt[maxn+d];inline bool equ (int x,int y,int l) {return rank[x]==rank[y] &&RANK[X+L]==RANK[Y+L];} void Init () {char Ch=getchar (), while (ch>= ' a ' &&ch<= ' z ') str[n++]=ch-' a ', Ch=getchar ();} void doubling () {str[n]=rank[n]=-1;for (int i=0;i<n;i++) sa[i]=i,rank[i]=str[i];for (int i,l=0,pos=0,sig=26;pos <n-1;sig=pos) {for (i=n-l,pos=0;i<n;i++) p[pos++]=i;for (i=0;i<n;i++) if (sa[i]>=l) p[pos++]=sa[i]-l; memset (cnt,0,sizeof cnt); for (i=0;i<n;i++) cnt[rank[p[i]]]++;for (i=1;i<=sig;i++) cnt[i]+=cnt[i-1];for (i=n-1; i>=0;i--) sa[--cnt[rank[p[i]]]]=p[i];for (temp[sa[0]]=pos=0,i=1;i<n;i++) {if (!equ (sa[i],sa[i-1],l)) pos++; Temp[sa[i]]=pos;} for (i=0;i<n;i++) rank[i]=temp[i];if (!l) L=1;else l<<=1;}} void Pre () {int i,k;for (i=k=0;i<n;i++) {if (k) k--;if (rank[i]==0) continue;for (int j=sa[rank[i]-1];str[i+k]==str[j+ K];) K++;heigHt[rank[i]]=k;}} void print () {for (int i=0;i<n;i++) printf ("%d", sa[i]+1);p rintf ("\ n"), for (int i=1;i<n;i++) printf ("%d", height[i ]);} int main () {init (); if (n==1) {printf ("1"); return 0;} Doubling ();p re ();p rint (); return 0;}
Suffix array template uoj#35. Suffix sort