博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3261 (后缀数组 二分) Milk Patterns
阅读量:5033 次
发布时间:2019-06-12

本文共 2243 字,大约阅读时间需要 7 分钟。

这道题和UVa 12206一样,求至少重复出现k次的最长字串。

首先还是二分最长字串的长度len,然后以len为边界对height数组分段,如果有一段包含超过k个后缀则符合要求。

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const int maxn = 20000 + 10; 7 const int maxm = 1000000 + 10; 8 9 int s[maxn];10 int sa[maxn], height[maxn], rank[maxn];11 int t[maxn], t2[maxn], c[maxm];12 int n, k;13 14 void build_sa(int m)15 {16 int i, *x = t, *y = t2;17 for(i = 0; i < m; i++) c[i] = 0;18 for(i = 0; i < n; i++) c[x[i] = s[i]]++;19 for(i = 1; i < m; i++) c[i] += c[i - 1];20 for(i = n - 1; i >= 0; i--) sa[--c[x[i]]] = i;21 for(int k = 1; k <= n; k <<= 1)22 {23 int p = 0;24 for(i = n - k; i < n; i++) y[p++] = i;25 for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k;26 for(i = 0; i < m; i++) c[i] = 0;27 for(i = 0; i < n; i++) c[x[y[i]]]++;28 for(i = 1; i < m; i++) c[i] += c[i - 1];29 for(i = n - 1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];30 swap(x, y);31 p = 1; x[sa[0]] = 0;32 for(i = 1; i < n; i++)33 x[sa[i]] = y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k] ? p - 1 : p++;34 if(p >= n) break;35 m = p;36 }37 }38 39 void build_height()40 {41 int i, j, k = 0;42 for(i = 0; i < n; i++) rank[sa[i]] = i;43 for(i = 0; i < n; i++)44 {45 if(k) k--;46 j = sa[rank[i] - 1];47 while(s[i + k] == s[j + k]) k++;48 height[rank[i]] = k;49 }50 }51 52 bool ok(int len)53 {54 int cnt = 0;55 for(int i = 0; i < n; i++)56 {57 if(i == 0 || height[i] < len) cnt = 0;58 if(++cnt >= k) return true;59 }60 return false;61 }62 63 int main()64 {65 //freopen("in.txt", "r", stdin);66 67 scanf("%d%d", &n, &k);68 for(int i = 0; i < n; i++)69 {70 scanf("%d", &s[i]);71 s[i]++;72 }73 s[n] = 0;74 build_sa(1000002);75 build_height();76 77 int L = 1, R = n;78 while(L < R)79 {80 int M = (L + R + 1) / 2;81 if(ok(M)) L = M;82 else R = M - 1;83 }84 85 printf("%d\n", L);86 87 return 0;88 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4448392.html

你可能感兴趣的文章
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
TFS --- GrantBackup Plan Permissions Error
查看>>
Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
查看>>
我们前端跟后端是怎么合作的
查看>>
mysql存储过程
查看>>
洛谷P2556 [AHOI2002] 黑白图像压缩 [模拟]
查看>>
letecode [136] - Single Number
查看>>
linux下设置固定IP的方法
查看>>
高效的jQuery
查看>>
ubuntu 16.04 (软件应用)-输入法
查看>>
windos7修复引导扇区
查看>>
Leetcode总结之Backtracking
查看>>
Android开发学习之路-图片颜色获取器开发(1)
查看>>
StackExchange.Redis 官方文档(一) Basics
查看>>
nupkg 之破解 nodejs+electron-packager 打包exe的解包
查看>>
Objective-C 使用 C++类
查看>>
浅谈之高级查询over(partition by)
查看>>
Notes: CRM Analytics–BI from a CRM perspective (2)
查看>>
graphite custom functions
查看>>
列出所有的属性键
查看>>