POJ
来源:互联网 发布:淘宝大学的证书 编辑:程序博客网 时间:2024/05/21 10:56
题意
给出长度为 n 的正整数串,求重复出现了至少 K 次的串的最大长度。
思路
后缀数组模板题。
链接
https://cn.vjudge.net/contest/177933#problem/G
代码
#include<cstdio>#include<iostream>using namespace std;const int maxn = 20010;int s[maxn];int sa[maxn];int t1[maxn], t2[maxn], c[maxn];int rank[maxn], height[maxn];void build_sa(int s[], int n, int m){ int *x = t1, *y = t2; for(int i = 0; i < m; i++) c[i] = 0; for(int i = 0; i < n; i++) c[x[i] = s[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) { int 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]] = y[sa[i-1]] == y[sa[i]] && y[sa[i-1]+j] == y[sa[i]+j] ? p-1 : p++; if(p >= n) break; m = p; }}void getHeight(int s[], int n){ int k = 0; 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(s[i+k] == s[j+k]) k++; height[rank[i]] = k; }}bool check(int n, int k, int t){ int num = 1; for(int i = 2; i <= n; i++) { if(height[i] >= t) { num ++; if(num >= k) return true; } else num = 1; } return false;}int main(){ int n, k; while(scanf("%d %d", &n, &k) == 2) { int Max = 0; for(int i = 0; i < n; i++) { scanf("%d", &s[i]); Max = max(Max, s[i]); } s[n] = 0; build_sa(s, n+1, Max+1); getHeight(s, n); int l = 0, r = n; int ans = 0; while(l <= r) { int mid = (l + r) >> 1; if(check(n, k, mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } printf("%d\n", ans); } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- 我的第一篇博客
- 3.3 设银行定期存款的年利率rate为2.25%,已知存款期为n年,存款本金为capital元,试编程计算并输出n年后的本利之和deposit
- html和JavaScript考试系统
- 数据库原理(一) 介绍
- [thinkPHP5项目实战_29]前台首页和文章搜索功能完善
- POJ
- 正则表达式-邮箱有效性验证
- day1
- 从无到有,使用Phalcon多模块作接口开发模板
- 确认末尾字符算法
- oracle 重复数据处理操作
- 基础练习 01字串
- C++学习资料
- HBase安装及操作