[Usaco2006 Dec]Milk Patterns
[Usaco2006 Dec]Milk Patterns
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
8 2
1
2
3
2
3
2
3
1
Sample Output
4
Source
后缀数组
答案应该是height数组中连续K-1个值的最小值的最大值。
这题还是要先离散化一下,不然可能会MLE
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 30010
using namespace std;
char ch;
int n,k,max_val,tot,head,tail,s[maxn],num[maxn],SA[maxn],rank[maxn],tmp[maxn],sum[maxn],height[maxn];
struct DATA{
int val,tim;
}list[maxn];
inline bool isdigit(char ch){return ''<=ch&&ch<='';}
inline void read(int &x){
for (ch=getchar();!isdigit(ch);ch=getchar());
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
}
inline bool cmp(int a,int b){return s[a]<s[b];}
void prepare(){
sort(num+,num++n,cmp);
for (int i=,pre=-;i<=n;i++){
if (s[num[i]]!=pre) pre=s[num[i]],++max_val;
s[num[i]]=max_val;
}
}
void get_SA(){
for (int i=;i<=n;i++) sum[tmp[i]=s[i]]++;
for (int i=;i<=max_val;i++) sum[i]+=sum[i-];
for (int i=n;i>=;i--) SA[sum[tmp[i]]--]=i;
rank[SA[]]=tot=;
for (int i=;i<=n;i++){
if (tmp[SA[i]]!=tmp[SA[i-]]) tot++;
rank[SA[i]]=tot;
}
for (int len=;len<=n;len<<=){
memset(sum,,sizeof(sum));
for (int i=;i<=n;i++) sum[rank[i+len]]++;
for (int i=;i<=n;i++) sum[i]+=sum[i-];
for (int i=n;i>=;i--) tmp[sum[rank[i+len]]--]=i;
memset(sum,,sizeof(sum));
for (int i=;i<=n;i++) sum[rank[tmp[i]]]++;
for (int i=;i<=n;i++) sum[i]+=sum[i-];
for (int i=n;i>=;i--) SA[sum[rank[tmp[i]]]--]=tmp[i];
tmp[SA[]]=tot=;
for (int i=;i<=n;i++){
if (rank[SA[i]]!=rank[SA[i-]]||rank[SA[i]+len]!=rank[SA[i-]+len]) tot++;
tmp[SA[i]]=tot;
}
for (int i=;i<=n;i++) rank[i]=tmp[i];
}
}
void get_height(){
for (int i=,j=;i<=n;i++){
if (rank[i]==) continue;
while (s[i+j]==s[SA[rank[i]-]+j]) j++;
height[rank[i]]=j;
if (j>) j--;
}
}
int main(){
read(n),read(k);
for (int i=;i<=n;i++) read(s[i]),num[i]=i;
prepare(),get_SA(),get_height();
k--,head=,tail=,max_val=;
for (int i=;i<=n;i++){
while (head<=tail&&i-list[head].tim>=k) head++;
while (head<=tail&&height[i]<list[tail].val) tail--;
list[++tail]=(DATA){height[i],i};
if (i>k&&max_val<list[head].val) max_val=list[head].val;
}
printf("%d\n",max_val);
return ;
}
[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: ...
- bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...
- 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 产奶的模式_后缀数组
BZOJ_1717_[Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他 ...
- 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组
[BZOJ1717][Usaco2006 Dec]Milk Patterns Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量 ...
- 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1469 Solved: ...
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组_二分答案
Milk Patterns 产奶的模式 bzoj-1717 Usaco-2006 Dec 题目大意:给定一个字符串,求最长的至少出现了$k$次的子串长度. 注释:$1\le n\le 2\cdot 1 ...
- 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 (二分+SA)
求重复k次的最长重复子串,解法见罗穗骞大神的后缀数组论文 ; var x,y,rank,sa,h,s,num,c:..maxn] of longint; n,time:longint; functio ...
随机推荐
- C#执行带参数的Oracle存储过程
public void UpdateByRowGuid(string RowGuid) { //OracleConnection conn = new OracleConnection("d ...
- linux下配置固定ip
今天在VM上装linux6.3,装的时候没有配置ip,虚拟机连接方式选的NAT方式,可以直接上网.我装这几次虚拟机系统只有这次虚拟机上去网了,挺爽.但是问题又出来了,就是我本机Windows远程不上虚 ...
- python_list和tuple互转
Python中,tuple和list均为内置类型, 以list作为参数将tuple类初始化,将返回tuple类型 tuple([1,2,3,4]) list->tuple 以tuple做为参数, ...
- JetBrains发布了一款免费的.NET反编译器dotPeek
Free .NET decompiler :: JetBrains dotPeek 主要的功能: Decompiling .NET 1.0-4.5 assemblies to C# Exporting ...
- js 中cookie 使用
一个系统有多种 角色, 每一种角色不同权限.后台请求的数据根据权限展示 ,所以要把权限保存在浏览器中. 首先 引入 在页面 <script type="text/javascript& ...
- Python程序的执行原理(转载)
Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...
- Oracle char 查询问题
近期碰到一个问题,数据库有个字段设置类型是char(2),然后数据库保存的数据位1,当使用hibernate 查询时 我使用query.setString("permissionLevel& ...
- 2015华为机试——数字基root
题目描写叙述: 求整数的Root:给定正整数,求每位数字之和;假设和不是一位数,则反复; 输入:输入随意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行相 ...
- 虚拟机如何访问tomcat
首先需要把tomcat和jdk整到虚拟机里,然后再在虚拟机里安装tomcat和jdk. 一.怎样把tomcat和jdk整到虚拟机里? 1,需要“ha_Serv-U6406 ftp服务器”的帮助,所以先 ...
- kissy
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...