uoj35 后缀排序
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;
}

浙公网安备 33010602011771号