其他分享
首页 > 其他分享> > 后缀数组

后缀数组

作者:互联网

一些废话

SA

构造

P3809 【模板】后缀排序

int c[N],m=300,x[N],y[N],sa[N];
inline void SA(){
    FOR(i,1,n) ++c[x[i]=S[i]];
    FOR(i,2,m) c[i]+=c[i-1];
    ROF(i,n,1) sa[c[x[i]]--]=i;
    for(int k=1;k<=n;k<<=1) {
        int num=0;
        FOR(i,n-k+1,n) y[++num]=i;
        FOR(i,1,n) if(sa[i]>k) y[++num]=sa[i]-k;
        FOR(i,1,m) c[i]=0;
        FOR(i,1,n) ++c[x[i]];
        FOR(i,2,m) c[i]+=c[i-1];
        ROF(i,n,1) sa[c[x[y[i]]]--]=y[i],y[i]=0;
        swap(x,y);
        x[sa[1]]=1;num=1;
        FOR(i,2,n) {
            x[sa[i]]=(y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k])?num:++num;
        }
        if(num==n) break ;
        m=num;
    }
}

标签:SAM,后缀,++,num,数组,sa,SA
来源: https://www.cnblogs.com/kzos/p/16343231.html