学了SA一个半月,该怎么打都忘了。。。
然后翻了翻学SA的博客和以前的代码,发现SA都求错了。。。
有dalao能帮我康康嘛/kel
#include<algorithm>
#include<cstring>
#include<cstdio>
const int M=2e5+5;
char s[M];
int n,CB[M],suff[M],x[M<<1],y[M<<1];
void GetSA(int n){
int i,k,m=128,num;
for(i=0;i<n;++i)++CB[x[i]=s[i]];
for(i=1;i<=m;++i)CB[i]+=CB[i-1];
for(i=n-1;i>=0;--i)suff[--CB[x[i]]]=i;
for(k=1;k<n;k<<=1){
num=0;
for(i=n-k;i<n;++i)y[++num]=i;
for(i=0;i<n;++i)if(suff[i]>=k)y[++num]=suff[i]-k;
for(i=0;i<=m;++i)CB[i]=0;
for(i=0;i<n;++i)++CB[suff[i]];
for(i=1;i<=m;++i)CB[i]+=CB[i-1];
for(i=n-1;i>=0;--i)suff[--CB[x[y[i]]]]=y[i],y[i]=0;
std::swap(x,y);
x[suff[num=0]]=0;
for(i=1;i<n;++i){
if(y[suff[i]]!=y[suff[i-1]]||y[suff[i]+k]!=y[suff[i-1]+k])++num;
x[suff[i]]=num;
}
if(num==n)return;
m=num;
}
}
signed main(){
int i;
scanf("%s",s);n=strlen(s);
for(i=0;i<n;++i)s[i+n]=s[i];
GetSA(n<<1);
for(i=0;i<(n<<1);++i){
if(suff[i]<n)printf("%c",s[suff[i]+n-1]);
}
}