1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1469 Solved: 799
[Submit][Status][Discuss]
Description
农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次。当K=2时,这个长度为4。
Input
* Line 1: 两个整数 N,K。
* Lines 2..N+1: 每行一个整数表示当天的质量值。
Output
* Line 1: 一个整数:N天中最长的出现了至少K次的模式的长度
Sample Input
1
2
3
2
3
2
3
1
Sample Output
题意
给定一个字符串,求至少出现k次的可重叠最长重复子串。
分析
后缀数组求出height(排名相邻的两个后缀的公共前缀),二分长度,在height中O(n)判断。
要求有连续k-1个height的值大于等于当前二分的长度才可以。
时间复杂度O(nlogn)
直接二分+hash也可以,复杂度相同
code
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int N = ; int s[N];
int t1[N],t2[N],c[N],sa[N],height[N],rank[N];
int n,m = ,k; void get_sa() {
int i,p,*x = t1,*y = t2;
for (i=; i<m; ++i) c[i] = ;
for (i=; i<n; ++i) x[i] = s[i],c[x[i]]++;
for (i=; i<m; ++i) c[i] += c[i-];
for (i=n-; i>=; --i) sa[--c[x[i]]] = i;
for (int k=; k<=n; k<<=) {
p = ;
for (i=n-k; i<n; ++i) y[p++] = i;
for (i=; i<n; ++i) if(sa[i]>=k) y[p++]=sa[i]-k;
for (i=; i<m; ++i) c[i] = ;
for (i=; i<n; ++i) c[ x[y[i]] ]++;
for (i=; i<m; ++i) c[i] += c[i-];
for (i=n-; i>=; --i) sa[--c[ x[y[i]] ]] = y[i];
swap(x,y);
p = ;
x[sa[]] = ;
for (i=; i<n; ++i)
x[sa[i]] = (y[sa[i-]]==y[sa[i]] && sa[i-]+k<n && sa[i]+k<n &&
y[sa[i-]+k]==y[sa[i]+k]) ? p- : p++;
if (p>=n) break;
m = p;
}
}
void get_height() {
for (int i=; i<n; ++i) rank[sa[i]] = i;
int k = ;
height[] = ;
for (int i=; i<n; ++i) {
if (!rank[i]) continue;
if (k) k--;
int j = sa[rank[i]-];
while (i+k<n && j+k<n && s[i+k]==s[j+k]) k++;
height[rank[i]] = k;
}
}
bool check(int x) {
int num = ;
for (int i=; i<n; ++i) {
if (height[i] >= x) {
num ++;
if (num == k-) return true;
}
else num = ;
}
return false;
}
int main () {
scanf("%d%d",&n,&k);
for (int i=; i<n; ++i) scanf("%d",&s[i]);
get_sa();
get_height();
int L = ,R = n,mid,ans;
while (L <= R) {
mid = (L + R) >> ;
if (check(mid)) ans = mid,L = mid + ;
else R = mid - ;
}
printf("%d",ans);
return ;
}
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式的更多相关文章
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...
- BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...
- 【刷题】BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...
- BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
[题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=1717 [题目大意] 求一个最长的串,使得其在母串中出现的次数达到要求 [题解] 二分答案 ...
- 【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
[算法]后缀数组 [题解]后缀数组 由于m太大,先离散化. 然后处理SA和LCP. 最后用单调队列处理即可. 注意实际上队列头尾长度限制是K-1. 删队尾不要删过头 i≥K才能开始统计答案. #inc ...
- bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式【后缀自动机】
就是后缀自动机的板子嘛..构造完自动机之后拓扑一下,记录size,对于size大于k的点和ans取max #include<iostream> #include<cstdio> ...
- bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...
随机推荐
- 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化
本文转自:http://www.trinea.cn/android/android-imagesdcardcache/ 本文主要介绍一个支持图片自动预取.支持多种缓存算法.支持数据保存和恢复的图片Sd ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:11.定制化Log输出
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在<迷你微信>服务器中,我们用了Log4J来进行输出,这可以在我们程序出现异常的时候找到错误发生时 ...
- centOS7虚拟机连接大网
1.启动vm服务 如果遇到无法启动时,需要还原vm默认配置解决 2.更改vm设置为NAT模式 3.centOS开启DHCP
- Winform调整DEV控件高度
- POJ 3469 Dual Core CPU(最小割模型的建立)
分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...
- 删除临时文件的bat文件
@echo offecho 正在清除系统垃圾文件,请稍等......del /f /s /q %systemdrive%\*.tmpdel /f /s /q %systemdrive%\*._mpde ...
- 逗塔战争TD新人入门图文攻略
逗塔战争TD新人入门图文攻略 <逗塔战争TD>是一张基于DOTA改编的塔防TD,很多玩家都很喜欢这张图,新手玩家怎么快速上手这张图呢?这张图的玩法和基本规则并不难,下面就为大家带来新人 ...
- SpringBoot2.X最佳实践《一》 之 SpringBoot2.x初体验
SpringBoot2.X最佳实践 前言 本系列文章,从零基础接触 SpringBoot2.x新版本,基础入门使用,热部署,到整合各个主流框架Redis4.x,消息队列AciveMQ, Rocket ...
- Oracle下如何收集 Systemstate dump
2: dump (不包括lock element) 10: dump 11: dump + global cache of RAC 256: short stack (函数堆栈) 258: 256+2 ...
- HttpServletRequest HttpServletResponse ServletException 重新打开后报红解决方法
tomcat安装路径下\lib\servlet-api.jar 复制到Dynamic Web Project 的 WEB-INF/lib下,刷新