SB求助SA
查看原帖
SB求助SA
160839
Prean楼主2020/8/2 16:37

学了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]);
    }
}
2020/8/2 16:37
加载中...