后缀数组 倍增算法
2017-03-16 17:23
127 查看
/* 后缀数组 倍增法 sa[i]表示从字符串sa[i]开始的后缀数组,排列第i S[sa[i]]<S[sa[i+1]] ran[i]表示从i下标开始的后缀数组,从小到大排列的名次 */ #include<iostream> #include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<cmath> using namespace std; typedef long long LL; const int maxn = 10000+10; int sa[maxn]; int tmp[maxn]; int ran[maxn]; int n, k; bool cmp(const int& i,const int& j) { if(ran[i] != ran[j]) return ran[i]<ran[j]; else { int ri = i+k<=n?ran[i+k]:-1; int rj = j+k<=n?ran[j+k]:-1; return ri<rj; } } void construct_sa(string s) { n = (int)s.size(); for (int i=0; i<=n; i++) { sa[i] = i; ran[i] = i==n?-1:s[i]; } for (k=1; k<=n; k*=2) { sort(sa, sa+n+1, cmp); tmp[sa[0]] = 0; for (int i=1; i<=n; i++) tmp[sa[i]] = tmp[sa[i-1]]+(cmp(sa[i-1], sa[i])?1:0); for (int i=0; i<=n; i++) ran[i] = tmp[i]; } } int main() { string s; cin>>s; construct_sa(s); return 0; }
相关文章推荐
- 后缀数组,Manber & Mayer 倍增算法
- 倍增算法求解字符串的后缀数组
- 后缀数组构建–倍增算法java实现
- 后缀数组,倍增算法
- 后缀数组-----倍增算法
- poj 2774求两个串的公共前缀 后缀数组
- 【SPOJ-SARRAY】Suffix Array【后缀数组】
- HDU1403 Longest Common Substring(最长公共子串、后缀数组入门)
- 【poj3581】Sequence 后缀数组
- 学渣乱搞系列之后缀数组
- HDU 3518 Boring counting[后缀数组]
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
- POJ 3261 Milk Patterns (离散化+后缀数组 k次最长重复子串(可重叠))
- 后缀数组 POJ 2217 Secretary
- 【后缀数组模板】
- HDU6194(后缀数组 + rmq)
- hdu 5442 F - Favorite Donut 后缀数组 / 字符串の最小表示法+kmp
- EOJ1805 POJ2217 最长公共子串(后缀数组+高度数组)
- HihoCoder1407 后缀数组二·重复旋律2
- POJ 3294 Life Forms(后缀数组+二分)