码迷,mamicode.com
首页 > 编程语言 > 详细

后缀数组模板

时间:2016-09-01 22:59:12      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

后缀有序化:

inline bool equ(int x,int y,int l){return rank[x]==rank[y]&&rank[x+l]==rank[y+l];}
void suffix_sort(){
    for(int i=1;i<=N;i++){sa[i]=i;rank[i]=s[i];}
    for(int i,pos=0,sig=255,l=0;pos<N;sig=pos){
        for(pos=0,i=N-l+1;i<=N;i++)p[++pos]=i;
        for(i=1;i<=N;i++)if(sa[i]>l)p[++pos]=sa[i]-l;
        for(i=1;i<=sig;i++)cnt[i]=0;
        for(i=1;i<=N;i++)cnt[rank[i]]++;
        for(i=1;i<=sig;i++)cnt[i]+=cnt[i-1];
        for(i=N;i;i--)sa[cnt[rank[p[i]]]--]=p[i];
        for(pos=0,i=1;i<=N;i++)tmp[sa[i]]=equ(sa[i],sa[i-1],l)?pos:++pos;
        for(i=1;i<=N;i++)rank[i]=tmp[i];
        l=l==0?1:l<<1;
    }
}

O(N)求height

1 void get_height(){
2     for(int i=1,j=0,k;i<=N;i++){
3         if(!(k=sa[rank[i]-1])){j=0;continue;}
4         if(j)j--;
5         while(s[i+j]==s[k+j])j++;
6         height[rank[i]]=j;
7     }
8 }

 

后缀数组模板

标签:

原文地址:http://www.cnblogs.com/Cydiater/p/5831415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!