POJ 3261 (后缀数组 二分) Milk Patterns
2015-04-22 19:01
357 查看
这道题和UVa 12206一样,求至少重复出现k次的最长字串。
首先还是二分最长字串的长度len,然后以len为边界对height数组分段,如果有一段包含超过k个后缀则符合要求。
代码君
首先还是二分最长字串的长度len,然后以len为边界对height数组分段,如果有一段包含超过k个后缀则符合要求。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 20000 + 10; const int maxm = 1000000 + 10; int s[maxn]; int sa[maxn], height[maxn], rank[maxn]; int t[maxn], t2[maxn], c[maxm]; int n, k; 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]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k] ? p - 1 : p++; if(p >= n) break; m = p; } } void build_height() { int i, j, k = 0; for(i = 0; i < n; i++) rank[sa[i]] = i; for(i = 0; i < n; i++) { if(k) k--; j = sa[rank[i] - 1]; while(s[i + k] == s[j + k]) k++; height[rank[i]] = k; } } bool ok(int len) { int cnt = 0; for(int i = 0; i < n; i++) { if(i == 0 || height[i] < len) cnt = 0; if(++cnt >= k) return true; } return false; } int main() { //freopen("in.txt", "r", stdin); scanf("%d%d", &n, &k); for(int i = 0; i < n; i++) { scanf("%d", &s[i]); s[i]++; } s = 0; build_sa(1000002); build_height(); int L = 1, R = n; while(L < R) { int M = (L + R + 1) / 2; if(ok(M)) L = M; else R = M - 1; } printf("%d\n", L); return 0; }
代码君
相关文章推荐
- |poj 3261|后缀数组|二分|Milk Patterns
- POJ - 3261 Milk Patterns (后缀数组+二分)
- poj 3261 Milk Patterns(后缀数组,二分)
- poj 3261 Milk Patterns (后缀数组+二分答案)
- poj 3261 Milk Patterns 后缀数组 二分
- POJ 3261 Milk Patterns(后缀数组+二分答案+离散化)
- poj 3261 Milk Patterns (后缀数组+二分)
- POJ - 3261 Milk Patterns 后缀数组 二分
- POJ 3261 Milk Patterns 后缀数组 二分答案
- Poj 3261 Milk Patterns(后缀数组+二分答案)
- POJ 3261 - Milk Patterns 求指定重复次数的最长子串,后缀数组+二分 or 线段树
- POJ 3261 Milk Patterns(后缀数组+二分答案)
- POJ 3261 Milk Patterns (后缀数组 + 二分)
- POJ 3261 Milk Patterns(后缀数组+二分)
- POJ 3261 Milk Patterns(后缀数组+二分答案+离散化)
- poj 3261 (后缀数组+二分)
- 【后缀数组】【poj 3261】Milk Patterns
- poj 3261 Milk Patterns (后缀数组 至少出现k次的可重叠最长重复子串)
- poj 3789 Milk Patterns(后缀数组+二分答案+height数组分组)
- POJ - 3261 - Milk Patterns(后缀数组-可重叠最长重复子串)