【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组
【BZOJ1717】[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
1
2
3
2
3
2
3
1
Sample Output
题解:论文中的例题。
由于数的范围比较大,直接上基数排序会炸,所以本题可以用快排来搞,(但是我没写出来快排233),好吧于是我就先离散化,然后再用基数排序做的。
先二分答案,将height分成长度不小于ans的若干组,如果某一组的后缀个数不小于k,那么存在满足条件的长度为ans的子串。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int maxn=20010;
- int n,m,K;
- int ra[maxn],rb[maxn],r[maxn],sa[maxn],st[maxn],rank[maxn],h[maxn];
- struct node
- {
- int num,org;
- }v[maxn];
- bool cmp(node a,node b)
- {
- return a.num<b.num;
- }
- int readin()
- {
- int ret=0; char gc;
- while(gc<'0'||gc>'9') gc=getchar();
- while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
- return ret;
- }
- void work()
- {
- int i,j,k,p,*x=ra,*y=rb;
- for(i=0;i<n;i++) st[x[i]=r[i]]++;
- for(i=1;i<m;i++) st[i]+=st[i-1];
- for(i=n-1;i>=0;i--) sa[--st[x[i]]]=i;
- for(j=p=1;p<n;j<<=1,m=p)
- {
- for(p=0,i=n-j;i<n;i++) y[p++]=i;
- for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
- for(i=0;i<m;i++) st[i]=0;
- for(i=0;i<n;i++) st[x[y[i]]]++;
- for(i=1;i<m;i++) st[i]+=st[i-1];
- for(i=n-1;i>=0;i--) sa[--st[x[y[i]]]]=y[i];
- for(swap(x,y),p=1,i=1,x[sa[0]]=0;i<n;i++)
- x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j])?p-1:p++;
- }
- for(i=1;i<n;i++) rank[sa[i]]=i;
- for(i=k=0;i<n-1;h[rank[i++]]=k)
- for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
- }
- int solve(int sta)
- {
- int i,tot=1;
- for(i=1;i<n;i++)
- {
- if(h[i]<sta) tot=0;
- if(++tot>=K) return 1;
- }
- return 0;
- }
- int main()
- {
- n=readin(),K=readin();
- int i;
- for(i=0;i<n;i++) v[i].num=readin(),v[i].org=i;
- sort(v,v+n,cmp);
- int pre=-1,now=0;
- for(i=0;i<n;i++)
- {
- if(v[i].num>pre) pre=v[i].num,now++;
- r[v[i].org]=now;
- }
- r[n++]=0;
- m=n;
- work();
- int L=1,R=n-1,mid;
- while(L<R)
- {
- mid=L+R>>1;
- if(solve(mid)) L=mid+1;
- else R=mid;
- }
- printf("%d",L-1);
- return 0;
- }
【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组的更多相关文章
- bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+二分)
/* 求可重叠的至少重复K次的最长字串 以1为下标起点,因为a[i]最大到1000000,所以要先离散一下 二分长度len 然后O(n)检验 后看h[i]是否有连续的一段h[i]大于len的,并且h[ ...
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式——后缀数组
Brief Description 给定一个字符串,求至少出现k次的最长重复子串. Algorithm Design 先二分答案,然后将后缀分成若干组.判断有没有一个组的后缀个数不小于k.如果有,那么 ...
- 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 产奶的模式 后缀数组+离散化
题目描述 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. John的牛奶按质量可以被赋予一 ...
- bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...
- [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 产奶的模式 (hash构造后缀数组,二分答案)
以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...
- BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...
随机推荐
- CodeIgniter(3.1.4)框架中添加执行时间统计代码
CodeIgniter(3.1.4)框架中添加,执行时间统计代码: system/core/CodeIgniter.php最后行处. /* * ---------------------------- ...
- 231个javascript特效分享
1.文本框焦点问题onBlur:当失去输入焦点后产生该事件onFocus:当输入获得焦点后,产生该文件Onchange:当文字值改变时,产生该事件Onselect:当文字加亮后,产生该文件 <i ...
- 关于Unity中的NGUI和UGUI
一.用Unity开发2D游戏,有三套关系 1.GUI:Unity本身自带的GUI 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后(其实是Uni ...
- repo manifest.xml 分析
repo是用于管理android的git仓库的工具. 之前想将android的代码放在github上面,并通过repo进行管理.但一直不知道怎么添加进去,那么多的git仓库,难道都要手动建立吗? 直到 ...
- oop-Inheritance & Polymorphism
本文主要作为java学习笔记,方便以后查看,大部分内容都源于以下网站: http://www.ntu.edu.sg/home/ehchua/programming/index.html#Game 本文 ...
- list模块
一. concat(Things) -> string() Types: Things = [Thing] Thing = atom() | integer() | float( ...
- Z字形扫描矩阵
问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...
- unity3d中的DontDestroyOnLoad来回切换出现多个实例问题
在用Unity3D开发游戏中,我们会经常创建多个场景,但是在场景过度的时候,通常场景中的对象会被删除.所以Unity3D给了我们一个不删除前一个 场景中的某一个对象或者脚本的API,那就是“DontD ...
- 中文路径-接口路径url不能传输中文解决方案
服务端:
- jquery-创建元素和添加子元素
一.创建新元素 1.使用$函数创建新元素 var $newElement=$('<div><p>段落</p></div>');//创建元素,返回jQue ...