首页 > 代码库 > 后缀数组模板
后缀数组模板
后缀有序化:
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 }
后缀数组模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。