后缀数组模板
2016-07-30 09:40
239 查看
///后缀数组模板 sa[i]表示所有后缀按字典数排序后以s[i] 开始的后缀排在第i位。height[i]表示字典数为i和i-1后缀的 的最长串的前缀。 int s[mx],sa[mx],t[mx],t2[mx],c[mx],n; int rank[mx],height[mx]; void build_sa(int m) { int i,*x=t,*y=t2; for (i=0;i<m;i++) c[i]=0; for (i=0;i<n;i++) c[x[i]=s[i]]++; for (i=1;i<m;i++) c[i]+=c[i-1]; for (i=n-1;i>=0;i--) sa[--c[x[i]]]=i; for (int k=1;k<=n;k<<=1) { int p=0; for (i=n-k;i<n;i++) y[p++]=i; for (i=0;i<n;i++) if (sa[i]>=k) y[p++]=sa[i]-k; for (i=0;i<m;i++) c[i]=0; for (i=0;i<n;i++) c[x[y[i]]]++; for (i=1;i<m;i++) c[i]+=c[i-1]; for (i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for (i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if (p>=n) break; m=p; } } void getHeight() { int i,j,k=0; for (i=0;i<n;i++) rank[sa[i]]=i; for (i=0;i<n;i++) { if (k) k--; int j=sa[rank[i]-1]; while (s[i+k]==s[j+k]) k++; height[rank[i]]=k; } }
相关文章推荐
- 练习场acm 题目8 一种排序
- 儿童自行车,淘宝。
- 使用DEDECMS织梦自带的邮件功能实现自定义表单邮件通知
- php操作cookie
- Python3之RabbitMQ
- Internal Temporary Tables
- codeforces 702B B. Powers of Two(水题)
- 自定义 checkbox 新玩法 ?
- 对奥卡姆剃刀(Occam’s razor)原理的思考
- android项目打包成jar
- DedeCMS提交自定义表单后自动发送邮件到站长邮箱的方法
- 52.黑色帽子
- java泛型小结1
- 神经网络与深度学习读书笔记第二天
- SQL注入--报错注入
- 信息系统监理的基本概念
- O(N) 的时间求 1 - N 关于 MOD 的逆元
- 5-31 字符串循环左移 (20分)
- 上海租房。20160420
- float数据在内存中的存储方法