[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的更多相关文章

  1. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: ...

  2. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...

  3. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

    二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...

  4. BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...

  5. BZOJ_1717_[Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组

    BZOJ_1717_[Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他 ...

  6. 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组

    [BZOJ1717][Usaco2006 Dec]Milk Patterns Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量 ...

  7. 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1469  Solved: ...

  8. [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组_二分答案

    Milk Patterns 产奶的模式 bzoj-1717 Usaco-2006 Dec 题目大意:给定一个字符串,求最长的至少出现了$k$次的子串长度. 注释:$1\le n\le 2\cdot 1 ...

  9. 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 (二分+SA)

    求重复k次的最长重复子串,解法见罗穗骞大神的后缀数组论文 ; var x,y,rank,sa,h,s,num,c:..maxn] of longint; n,time:longint; functio ...

随机推荐

  1. intellij安装 配置 创建项目

    使用intellij创建项目的整个过程如下: 首先,点击intllij的.exe文件,如果是第一次安装,选择第二个选项即可 Intellij需要license key,可以使用注册机生成相应的name ...

  2. shell 验证ip

    #!/bin/bash function isIp(){ IP=$ ];then echo "Wrong IP!" exit else a=`echo $IP | awk -F . ...

  3. [Redux] Adding React Router to the Project

    We will learn how to add React Router to a Redux project and make it render our root component. Inst ...

  4. android 47 service绑定

    如果一个service已经启动了,activity和service绑定了在解除邦定,则这个service不会销毁,因为这个service不是这个Activity创建的. service生命周期: Ac ...

  5. android 14 进度条和拖动条

    进度条: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l ...

  6. 常用Content-type汇总

    Content-Type,内容类型,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式.什么编码读取这个文件.这里汇总一下常用的,所有资料来源于网络,未经测试:  文件后缀 处理方式  .* ...

  7. 自己写的Dapper通用数据访问层

    using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Data.O ...

  8. 9.21 noip模拟试题

    Problem 1 护花(flower.cpp/c/pas) [题目描述] 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时 ...

  9. Unity3D 常用事件

    这里总结一下U3D常用的一些事件 //按下事件,GetKeyDown //抬起事件,Input.GetKeyUp //长按事件,Input.GetKey //任意键按下事件,Input.anyKeyD ...

  10. WCF 用netTcpbinding,basicHttpBinding 传输大文件

    问题:WCF如何传输大文件 方案:主要有几种绑定方式netTcpbinding,basicHttpBinding,wsHttpbinding,设置相关的传输max消息选项,服务端和客户端都要设置,tr ...