【POJ 3261】Milk Patterns
【链接】h在这里写链接
【题意】
问你能不能在其中找到一个最长的子串。
这个子串至少出现了k次.
【题解】
后缀数组+二分。
N最大为20000;
每个数字在0到1e5之间
防止出错,把那个数字都加上1就好
【错的次数】
【反思】
【代码】
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- const int N = 2e5;
- const int MAX_CHAR = 1e5+10;//每个数字的最大值。
- int s[N + 10];//如果是数字,就写成int s[N+10]就好,从0开始存
- int Sa[N + 10], T1[N + 10], T2[N + 10], C[N + 10];
- int Height[N + 10], Rank[N + 10];
- void build_Sa(int n, int m) {
- int i, *x = T1, *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 n)
- {
- int i, j, k = 0;
- for (i = 1; 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;
- }
- }
- int n, k;
- bool ok(int l)
- {
- int cnt = 0;
- for (int i = 2; i <= n; i++)
- if (Height[i] >= l)
- {
- cnt++;
- if (cnt >= k - 1) return true;
- }
- else
- {
- cnt = 0;
- }
- return false;
- }
- int main()
- {
- //freopen("F:\\rush.txt", "r", stdin);
- scanf("%d%d", &n, &k);
- for (int i = 0; i < n; i++)
- {
- scanf("%d", &s[i]);
- s[i]++;
- }
- s[n] = 0;
- build_Sa(n + 1, MAX_CHAR);
- getHeight(n);
- int l = 1, r = n, temp = 0;
- while (l <= r)
- {
- int mid = (l + r) >> 1;
- if (ok(mid))
- {
- temp = mid;
- l = mid + 1;
- }
- else
- r = mid - 1;
- }
- printf("%d\n", temp);
- return 0;
- }
【POJ 3261】Milk Patterns的更多相关文章
- 【poj 3261】Milk Patterns 后缀数组
Milk Patterns 题意 给出n个数字,以及一个k,求至少出现k次的最长子序列的长度 思路 和poj 1743思路差不多,二分长度,把后缀分成若干组,每组任意后缀公共前缀都>=当前二分的 ...
- 【POJ 3261】Milk Patterns 可重叠的k次最长重复子串
可重叠的k次最长重复子串 #include<cstdio> #include<cstring> #include<algorithm> using namespac ...
- 【POJ 3167】Cow Patterns (KMP+树状数组)
Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- 【BZOJ1717&POJ3261】Milk Patterns(后缀数组,二分)
题意:求字符串的可重叠的k次最长重复子串 n<=20000 a[i]<=1000000 思路:后缀数组+二分答案x,根据height分组,每组之间的height>=x 因为可以重叠, ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
随机推荐
- [转]C# 委托、事件,lamda表达式
1. 委托Delegate C#中的Delegate对应于C中的指针,但是又有所不同C中的指针既可以指向方法,又可以指向变量,并且可以进行类型转换, C中的指针实际上就是内存地址变量,他是可以直接操作 ...
- [转]基于MefBootstrapper的Bootstrapper
public class Bootstrapper : MefBootstrapper { ModuleCatalog moduleCatalog; protected overr ...
- 廖雪峰Java10加密与安全-5签名算法-2DSA签名算法
DSA DSA:Digital Signature Algorithm,使用EIGamal数字签名算法,和RSA数字签名相比,DSA更快. DSA只能配合SHA使用: SHA1withDSA SHA2 ...
- day43作业
注册页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Mybatis框架+原理
https://www.cnblogs.com/luoxn28/p/6417892.html(转载,蛮详细的)
- vue.js_05_vue.js的过滤器
1.过滤器的定义和使用 实现:将页面的中的单纯替换成,用户传来的文字. 全局过滤器:所有的Vue对象都可以使用 <body> <div id="app"> ...
- spring cloud深入学习(八)-----配置中心svn示例和refresh
svn版本 同样先示例server端的代码,基本步骤一样. 1.添加依赖 <dependencies> <dependency> <groupId>org.spri ...
- Jmeter分布式测试笔记
在性能测试过程中,如果要求并发数较大时(例如1000+),单机配置cpu与内存等无法支持,则需要使用Jmeter的分布式测试方法. 一.一般什么情况下需要分布式 1.前辈经验:比如机器i5双核的cpu ...
- 玩转vue的slot内容分发
vue的内容分发非常适合"固定部分+动态部分"的组件的场景,固定部分可以是结构固定,也可以是逻辑固定,比如下拉loading,下拉loading只是中间内容是动态的,而拉到底部都会 ...
- kuangbin带我飞QAQ 最短路
1. poj 1502 Mathches Game 裸最短路 #include <iostream> #include <string.h> #include <cstd ...