后缀数组模板
2014-02-04 15:28
417 查看
http://caiminjian.diandian.com/post/2012-08-27/40038043416 算法解释
N为一倍即可,m至少比最大值大1
n = 8 ;
num[] = { 1, 1, 2, 1, 1, 1, 1, 2, $ }.
rank[] = { 4, 6, 8, 1, 2, 3, 5, 7, 0 }. (rank[0~n-1]为有效值)
sa[] = { 8, 3, 4, 5, 0, 6, 1, 7, 2 }. (sa[1~n]为有效值)
height[] = { 0, 0, 3, 2, 3, 1, 2, 0, 1 }. (height[2~n]为有效值)
N为一倍即可,m至少比最大值大1
n = 8 ;
num[] = { 1, 1, 2, 1, 1, 1, 1, 2, $ }.
rank[] = { 4, 6, 8, 1, 2, 3, 5, 7, 0 }. (rank[0~n-1]为有效值)
sa[] = { 8, 3, 4, 5, 0, 6, 1, 7, 2 }. (sa[1~n]为有效值)
height[] = { 0, 0, 3, 2, 3, 1, 2, 0, 1 }. (height[2~n]为有效值)
int s ,wa ,wc ,wv ,sa ,wb ,height ,rank ; inline bool cmp(int *r,int a,int b,int l) { return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(int *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) wc[i]=0; for(i=0;i<n;i++) wc[x[i]=r[i]]++; for(i=1;i<m;i++) wc[i]+=wc[i-1]; for(i=n-1;i>=0;i--) sa[--wc[x[i]]]=i; for(j=1,p=1;p<n;j<<=1,m=p) { for(i=n-j,p=0;i<n;i++) y[p++]=i; for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j; for(i=0;i<n;i++) wv[i]=x[y[i]]; for(i=0;i<m;i++) wc[i]=0; for(i=0;i<n;i++) wc[wv[i]]++; for(i=1;i<m;i++) wc[i]+=wc[i-1]; for(i=n-1;i>=0;i--) sa[--wc[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } } void getheight(int *r,int *sa,int n) { int i,j,k=0; for(i=1;i<=n;i++) rank[sa[i]]=i; for(i=0;i<n;height[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); }
相关文章推荐
- SVN配置使用BeyoundCompare作为比较合并工具
- 蓝桥杯在线测试的题解
- C# Common Keyword
- 励志---决定你一生成就的21个信念及要点
- fckeditor编辑器的使用
- R语言字符串函数
- 使用图形界面调试arm程序: insight + gdb
- 正式在CSDN开博
- XMLPULL解析(2)---通过对象序列化生成XML文档
- UVA 424和10106的个人体会
- POJ 2486 经典树形dp
- LockDemo
- 安装debian linux后的优化配置
- Linux内核编译,模块尺寸变大的解决办法
- 程序员必看的那些电影
- Initialising Memories
- tomcat的一些设置
- java学习之面试题3
- SPOJ 220 Relevant Phrases of Annihilation(后缀数组)
- 2014学习计划