首页 > 技术文章 > 后缀数组模板

live-no-regrets 2017-11-07 21:40 原文

  码一下最近写的模板。

#include<algorithm>

long wv[N],ws[N];

bool cmp(long *r,long a,long b,long len)
{
    return r[a]==r[b]&&r[a+len]==r[b+len];
}

void da(char *c,long *sa,long *rk1,long *rk2,long n,long m)
{
    long i,j,p;
    
    for (i=0;i<n;i++)ws[i]=0;
    for (i=1;i<=n;i++)ws[rk1[i]=c[i]-'a']++;
    for (i=1;i<m;i++)ws[i]+=ws[i-1];
    for (i=n-1;i>=0;i--)sa[--ws[rk1[i]]]=i;
    
    for (j=1,p=1;p<n;j<<=1,m=p){
        for (p=0,i=n-j;i<n;i++)rk2[p++]=i;
        for (i=0;i<n;i++)
            if (sa[i]>=j)rk2[p++]=rk1[i]-j;
        
        for (i=0;i<n;i++)wv[i]=rk1[rk2[i]];
        for (i=1;i<m;i++)ws[i]=0;
        for (i=0;i<n;i++)ws[wv[i]]++;
        for (i=1;i<m;i++)ws+=ws[i-1];
        for (i=n-1;i>=0;i--)sa[--ws[wv[i]]]=rk2[i];
        
        swap(rk1,rk2);
        rk1[sa[0]]=0;
        for (p=1,i=1;i<n;i++)rk1[sa[i]]=cmp(rk2,sa[i-1],sa[i],j)?p-1:p++;
    }
}

 

推荐阅读