数据结构模板

后缀数组(倍增):

struct S_array{
    int s[N],sa[N],t[N],t2[N],c[N],n;
    int f[N][20];
    void build_sa(int m){ //字符个数 
        int i,*x=t,*y=t2;
        for(i=0;i<m;i++)c[i]=0;
        for(i=0;i<n;i++)c[x[i]=s[i]]++;
        for(i=1;i<m;i++)c[i]+=c[i-1];
        for(i=n-1;i>=0;i--)sa[--c[x[i]]]=i;
        for(int k=1;k<=n;k<<=1){
            int p=0;
            for(i=n-k;i<n;i++)y[p++]=i;
            for(i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k;
            for(i=0;i<m;i++)c[i]=0;
            for(i=0;i<n;i++)c[x[y[i]]]++;
            for(i=0;i<m;i++)c[i]+=c[i-1];
            for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i];
            swap(x,y);
            p=1;x[sa[0]]=0;
            for(i=1;i<n;i++)
            x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
            if(p>=n)break;
            m=p;
        }
    }
    int rank[N],height[N];
    void getHeight(){
        int i,j,k=0;
        for(i=0;i<n;i++)rank[sa[i]]=i;
        for(i=0;i<n;i++){
            if(k)k--;
            int j=sa[rank[i]-1];
            while(s[i+k]==s[j+k])k++;
            height[rank[i]]=k;
        }
    }
    void rmq(){
        for(int i=1;i<n;i++)    f[i][0]=height[i];
        for(int j=1;j<20;j++)
            for(int i=1;i+(1<<j)-1<n;i++)
                f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
    }
    int lcp(int l,int r){
        int k=log2(r-l+1);
        return min(f[l][k],f[r+1-(1<<k)][k]);
    }
    
}sa;
View Code
posted @ 2019-08-28 16:46  WAKBGAN  阅读(245)  评论(0编辑  收藏  举报