http://uoj.ac/problem/35
#include<cstdio> #include<cstring> #define FOR(i,s,t) for(register int i=s;i<=t;++i) #define ROF(i,s,t) for(register int i=s;i>=t;--i) const int maxn=100011; int n,m,p; char S[maxn]; int a[maxn],v[maxn],h[maxn],sa[2][maxn],rk[2][maxn]; inline void mul(int k){ FOR(i,1,n)v[rk[p][sa[p][i]]]=i; ROF(i,n,1)if(sa[p][i]>k)sa[p^1][v[rk[p][sa[p][i]-k]]--]=sa[p][i]-k; FOR(i,n-k+1,n)sa[p^1][v[rk[p][i]]--]=i; FOR(i,1,n)rk[p^1][sa[p^1][i]]=rk[p^1][sa[p^1][i-1]]+(rk[p][sa[p^1][i]]!=rk[p][sa[p^1][i-1]]||rk[p][sa[p^1][i]+k]!=rk[p][sa[p^1][i-1]+k]); } inline void presa(){ FOR(i,1,n)a[i]=S[i]-'a'+1; FOR(i,1,n)++v[a[i]]; FOR(i,1,30)v[i]+=v[i-1]; FOR(i,1,n)sa[p][v[a[i]]--]=i; FOR(i,1,n)rk[p][sa[p][i]]=rk[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]); for(register int k=1;k<n;k<<=1,p^=1)mul(k); for(register int i=1,j,k=0;i<=n;++i){ j=sa[p][rk[p][i]-1]; while(S[i+k]==S[j+k])++k; h[rk[p][i]]=k;if(k)--k; } } int main(){ scanf("%s",S+1); n=strlen(S+1); presa(); FOR(i,1,n)printf("%d ",sa[p][i]); puts(""); FOR(i,2,n)printf("%d ",h[i]); return 0; }