【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

8 2
1
2
3
2
3
2
3
1

Sample Output

4

题解:论文中的例题。

由于数的范围比较大,直接上基数排序会炸,所以本题可以用快排来搞,(但是我没写出来快排233),好吧于是我就先离散化,然后再用基数排序做的。

先二分答案,将height分成长度不小于ans的若干组,如果某一组的后缀个数不小于k,那么存在满足条件的长度为ans的子串。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn=20010;
  7. int n,m,K;
  8. int ra[maxn],rb[maxn],r[maxn],sa[maxn],st[maxn],rank[maxn],h[maxn];
  9. struct node
  10. {
  11. int num,org;
  12. }v[maxn];
  13. bool cmp(node a,node b)
  14. {
  15. return a.num<b.num;
  16. }
  17. int readin()
  18. {
  19. int ret=0; char gc;
  20. while(gc<'0'||gc>'9') gc=getchar();
  21. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  22. return ret;
  23. }
  24. void work()
  25. {
  26. int i,j,k,p,*x=ra,*y=rb;
  27. for(i=0;i<n;i++) st[x[i]=r[i]]++;
  28. for(i=1;i<m;i++) st[i]+=st[i-1];
  29. for(i=n-1;i>=0;i--) sa[--st[x[i]]]=i;
  30. for(j=p=1;p<n;j<<=1,m=p)
  31. {
  32. for(p=0,i=n-j;i<n;i++) y[p++]=i;
  33. for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
  34. for(i=0;i<m;i++) st[i]=0;
  35. for(i=0;i<n;i++) st[x[y[i]]]++;
  36. for(i=1;i<m;i++) st[i]+=st[i-1];
  37. for(i=n-1;i>=0;i--) sa[--st[x[y[i]]]]=y[i];
  38. for(swap(x,y),p=1,i=1,x[sa[0]]=0;i<n;i++)
  39. x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j])?p-1:p++;
  40. }
  41. for(i=1;i<n;i++) rank[sa[i]]=i;
  42. for(i=k=0;i<n-1;h[rank[i++]]=k)
  43. for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
  44. }
  45. int solve(int sta)
  46. {
  47. int i,tot=1;
  48. for(i=1;i<n;i++)
  49. {
  50. if(h[i]<sta) tot=0;
  51. if(++tot>=K) return 1;
  52. }
  53. return 0;
  54. }
  55. int main()
  56. {
  57. n=readin(),K=readin();
  58. int i;
  59. for(i=0;i<n;i++) v[i].num=readin(),v[i].org=i;
  60. sort(v,v+n,cmp);
  61. int pre=-1,now=0;
  62. for(i=0;i<n;i++)
  63. {
  64. if(v[i].num>pre) pre=v[i].num,now++;
  65. r[v[i].org]=now;
  66. }
  67. r[n++]=0;
  68. m=n;
  69. work();
  70. int L=1,R=n-1,mid;
  71. while(L<R)
  72. {
  73. mid=L+R>>1;
  74. if(solve(mid)) L=mid+1;
  75. else R=mid;
  76. }
  77. printf("%d",L-1);
  78. return 0;
  79. }

【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组的更多相关文章

  1. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+二分)

    /* 求可重叠的至少重复K次的最长字串 以1为下标起点,因为a[i]最大到1000000,所以要先离散一下 二分长度len 然后O(n)检验 后看h[i]是否有连续的一段h[i]大于len的,并且h[ ...

  2. [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式——后缀数组

    Brief Description 给定一个字符串,求至少出现k次的最长重复子串. Algorithm Design 先二分答案,然后将后缀分成若干组.判断有没有一个组的后缀个数不小于k.如果有,那么 ...

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

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

  4. 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组+离散化

    题目描述 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. John的牛奶按质量可以被赋予一 ...

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

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

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

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

  7. [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)

    以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...

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

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

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

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

随机推荐

  1. CodeIgniter(3.1.4)框架中添加执行时间统计代码

    CodeIgniter(3.1.4)框架中添加,执行时间统计代码: system/core/CodeIgniter.php最后行处. /* * ---------------------------- ...

  2. 231个javascript特效分享

    1.文本框焦点问题onBlur:当失去输入焦点后产生该事件onFocus:当输入获得焦点后,产生该文件Onchange:当文字值改变时,产生该事件Onselect:当文字加亮后,产生该文件 <i ...

  3. 关于Unity中的NGUI和UGUI

    一.用Unity开发2D游戏,有三套关系 1.GUI:Unity本身自带的GUI 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后(其实是Uni ...

  4. repo manifest.xml 分析

    repo是用于管理android的git仓库的工具. 之前想将android的代码放在github上面,并通过repo进行管理.但一直不知道怎么添加进去,那么多的git仓库,难道都要手动建立吗? 直到 ...

  5. oop-Inheritance & Polymorphism

    本文主要作为java学习笔记,方便以后查看,大部分内容都源于以下网站: http://www.ntu.edu.sg/home/ehchua/programming/index.html#Game 本文 ...

  6. list模块

    一.   concat(Things) -> string() Types:    Things = [Thing]    Thing = atom() | integer() | float( ...

  7. Z字形扫描矩阵

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  8. unity3d中的DontDestroyOnLoad来回切换出现多个实例问题

    在用Unity3D开发游戏中,我们会经常创建多个场景,但是在场景过度的时候,通常场景中的对象会被删除.所以Unity3D给了我们一个不删除前一个 场景中的某一个对象或者脚本的API,那就是“DontD ...

  9. 中文路径-接口路径url不能传输中文解决方案

    服务端:

  10. jquery-创建元素和添加子元素

    一.创建新元素 1.使用$函数创建新元素 var $newElement=$('<div><p>段落</p></div>');//创建元素,返回jQue ...