[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. c# 字符串转化成声音 分类: C# 2014-09-24 12:20 316人阅读 评论(0) 收藏

    说明: (1)支持Window 7系统,但是xp系统智能朗读英文和数字: (2)添加引用 Interop.SpeechLib.dll; (3)使用时调用StringToVoice(str)即可. us ...

  2. winform 窗体最大化 分类: WinForm 2014-07-17 15:57 215人阅读 评论(0) 收藏

    1:窗体首次加载时最大化 (1):主窗体 this.WindowState = FormWindowState.Maximized; //窗体显示中间部分,不显示窗体名称和最小化.最大化.关闭按钮   ...

  3. jquery 实现页面拖拽并保存到cookie

    实现的效果就是页面内的图片可拖拽到任意位置,并将所在位置保存.下次打开页面依然可见.本文是作demo用,实际开发中,位置的数据应保存到数据库中. 好了,开始. 1.准备工作. a.jquery(1.7 ...

  4. RPM制作

    http://blog.csdn.net/justlinux2010/article/details/9905425

  5. Linux yum命令重装mysql

    如果是 rpm 安装的话,可以用 rpm -e mysql-server 如果是yum安装的,可以用 yum remove mysql* 删除MySQL安装文件夹 然后使用yum安装mysql: 1. ...

  6. 2进制,16进制,BCD,ascii,序列化对象相互转换

    public final static char[] BToA = "0123456789abcdef".toCharArray() ; 1.16进制字符串转为字节数组 /** * ...

  7. 获取服务器端ip

    System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]

  8. 知识点摸清 - - function()——JavaScript 函数名后什么时候加括号,什么时候不

    加括号——调用函数 只要是要调用函数执行的,都必须加括号. 此时,function()实际上等于函数的返回值.(没有返回值也已经执行了函数体内的行为).就是说,只要加括号的,就代表将会执行函数体代码. ...

  9. Java方法-数组

    [Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...

  10. Java 获取字符串中第N次出现的字符位置

    public static int getCharacterPosition(String string){    //这里是获取"/"符号的位置    Matcher slash ...