后缀数组nlogn模板
来源:互联网 发布:apache的ftpclient 编辑:程序博客网 时间:2024/06/08 19:45
int t1[maxn],t2[maxn],c[maxn]; bool cmp(int *r,int a,int b,int l) { return r[a]==r[b] &&r[l+a] == r[l+b]; } //计算出来的高度数组的值是和前一位的最长公共前缀 void get_sa(int str[],int sa[],int Rank[],int height[],int n,int m) { n++; int p,*x=t1,*y=t2; for(int i = 0; i < m; i++) c[i] = 0; for(int i = 0; i < n; i++) c[x[i] = str[i]]++; for(int i = 1; i < m; i++) c[i] += c[i-1]; for(int i = n-1; i>=0; i--) sa[--c[x[i]]] = i; for(int j = 1; j <= n; j <<= 1) { p = 0; for(int i = n-j; i < n; i++) y[p++] = i; for(int i = 0; i < n; i++) if(sa[i] >= j) y[p++] = sa[i]-j; for(int i = 0; i < m; i++) c[i] = 0; for(int i = 0; i < n; i++) c[x[y[i]]]++ ; for(int i = 1; i < m; i++) c[i] += c[i-1]; for(int i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i]; swap(x,y); p = 1; x[sa[0]] = 0; for(int i = 1; i < n; i++) x[sa[i]] = cmp(y,sa[i-1],sa[i],j)? p-1:p++; if(p >= n) break; m = p; } int k = 0; n--; for(int i = 0; i <= n; i++) Rank[sa[i]] = i; for(int i = 0; i < n; i++) { if(k) k--; int j = sa[Rank[i]-1]; while(str[i+k] == str[j+k]) k++; height[Rank[i]] = k; } }
阅读全文
0 0
- 后缀数组nlogn模板
- [Tyvj 1860] 后缀数组 倍增O(nlogn) 求sa[],height[]模板,单调栈维护,求特征值
- 【后缀数组】后缀数组模板
- 后缀数组【模板】
- 【后缀数组模板】
- 后缀数组模板
- 后缀数组模板
- 【模板】后缀数组
- 后缀数组模板
- 后缀数组模板
- 后缀数组模板
- 【省选】【后缀数组】模板
- 后缀数组 模板
- 后缀数组 模板
- 后缀数组模板
- 后缀数组模板
- 后缀数组模板
- 后缀数组模板
- java 单例设计模式
- localStorage和sessionStorage区别
- 外键关联非主键id时-hbm.xml配置
- Spring基础
- ARC下OC对象和CF对象之间的桥接(bridge)
- 后缀数组nlogn模板
- B
- jquery 获取当前时间
- 见微知著----POJ1703(并查集)
- 红黑树的学习过程
- [LightOJ-1214][Java] Large Division
- 最长上升子序列模板(LIS)
- springboot(十四)使用spring retry
- MFC中单选按钮(Radio Button)的简单使用