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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 881  Solved: 480
[Submit][Status][Discuss]

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

HINT

Source

Gold

Solution

后缀数组 求 可重叠的k次最长重复子串

先二分答案,然后对后缀分组

判断是否存在一个组,其后缀个数>=K,如果存在则存在解,否则不存在

时间复杂度O(nlogn)

Code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. using namespace std;
  5. inline int read()
  6. {
  7. int x=,f=; char ch=getchar();
  8. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  9. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
  10. return x*f;
  11. }
  12. #define maxn 20002
  13. int n,K;
  14. int ws[maxn],wv[maxn],wa[maxn],wb[maxn];
  15. int S[maxn],SA[maxn];
  16. inline int cmp(int *r,int a,int b,int l)
  17. {
  18. return r[a]==r[b]&&r[a+l]==r[b+l];
  19. }
  20. inline void DA(int *r,int *sa,int n,int m)
  21. {
  22. int p,*x=wa,*y=wb,*t;
  23. for (int i=; i<m; i++) ws[i]=;
  24. for (int i=; i<n; i++) ws[x[i]=r[i]]++;
  25. for (int i=; i<m; i++) ws[i]+=ws[i-];
  26. for (int i=n-; i>=; i--) sa[--ws[x[i]]]=i;
  27. p=; for (int j=; p<n; j*=,m=p)
  28. {
  29. p=; for (int i=n-j; i<n; i++) y[p++]=i;
  30. for (int i=; i<n; i++) if (sa[i]>=j) y[p++]=sa[i]-j;
  31. for (int i=; i<n; i++) wv[i]=x[y[i]];
  32. for (int i=; i<m; i++) ws[i]=;
  33. for (int i=; i<n; i++) ws[wv[i]]++;
  34. for (int i=; i<m; i++) ws[i]+=ws[i-];
  35. for (int i=n-; i>=; i--) sa[--ws[wv[i]]]=y[i];
  36. t=x,x=y,y=t;p=;x[sa[]]=;
  37. for (int i=; i<n; i++)
  38. x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
  39. }
  40. }
  41. int rank[maxn],height[maxn];
  42. inline void calheight(int *r,int *sa,int n)
  43. {
  44. int k=;
  45. for (int i=; i<=n; i++) rank[sa[i]]=i;
  46. for (int i=; i<n; height[rank[i++]]=k)
  47. {k?k--:;for (int j=sa[rank[i]-]; r[i+k]==r[j+k]; k++);}
  48. }
  49. inline bool check(int x)
  50. {
  51. int tmp=,cnt=;
  52. for (int i=; i<=n; i++)
  53. {
  54. if (height[i]<x)
  55. {if (cnt>tmp) tmp=cnt;cnt=;}
  56. else
  57. if (!cnt) cnt=; else ++cnt;
  58. }
  59. if (cnt>tmp) tmp=cnt;
  60. if (tmp>=K) return ;
  61. else return ;
  62. }
  63. int main()
  64. {
  65. n=read(),K=read();
  66. for (int i=; i<n; i++) S[i]=read();
  67. S[n]=;
  68. DA(S,SA,n+,);
  69. calheight(S,SA,n);
  70. int l=,r=n,mid;
  71. while (l<r)
  72. {
  73. mid=(l+r+)>>;
  74. if (check(mid)) l=mid;
  75. else r=mid-;
  76. }
  77. printf("%d\n",l);
  78. return ;
  79. }

在BZOJ上企图冲一波榜,rk1,rk2  0ms打表..并列rk3,实际rk6压了好久愣是上不去了,纸张!

【BZOJ-1717】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 产奶的模式 后缀数组

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

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

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

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

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

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

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

  6. 【BZOJ】【1717】【USACO 2006 Dec】Milk Patterns产奶的模式

    后缀数组 o(︶︿︶)o 唉傻逼了一下,忘了把后缀数组的字典范围改回20001,直接21交了上去,白白RE了两发……sigh 既然要找出现了K次的子串嘛,那当然要用后缀数组了>_>(因为我 ...

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

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

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

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

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

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

随机推荐

  1. 在SecureCRT中使用rz和sz传输文件

    首先检查Centos中有没有安装 lrzsz sudo yum install lrzsz 使用yum install的时候碰到一个问题, 不知道是否和虚拟机环境有关 Existing lock /v ...

  2. ASP.NET Repeater 绑定 DropDownList Calendar 选择日期

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  3. Codevs 1051 二叉树最大宽度和高度

    1501 二叉树最大宽度和高度  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver       题目描述 Description 给出一个二叉树,输出它的最大宽 ...

  4. eval的对于验证数学公式的用处

    var a=10,b=20; var s=a+b+((a/b)+(a+(a-b)))+(11)/a; var r=eval(s); console.log(r); 只要不报错,说明公式正确, 报错公式 ...

  5. jboss CLI 命令行接口学习(适用JBOSS EAP 6.2+)

    一.确认CLI所使用的端口 以domain模式为例,查看domain controller(也就是master主机)上的host.xml <management-interfaces> & ...

  6. JavaScript的一些知识碎片(2)-反射-全局变量-回调

    JavaScript中的反射:编程语言中的反射原理都一样,就是通过操作metadata(描述语言的语言)来完成一些不具备反射功能的语言很难实现的功能.在静态语言中,反射是一个高大上的东西,比如在运行时 ...

  7. JavaScript 位运算总结&拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

  8. 【翻译】Windows 10 中为不同设备加载不同页面的3种方法

    在以前,为PC和手机做App是两个工程,PC和手机各一个.在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大 ...

  9. fdisk分区硬盘并shell脚本自动化

    最近工作需要用到对硬盘进行shell脚本自动化分区和mount的操作,google了一些资料,下面做个总结. 如果硬盘没有进行分区(逻辑分区或者扩展分区,关于两者概念,自行google),我们将无法将 ...

  10. Vue-loader 开启压缩后的一些坑

    在使用vue-loader 配合webpack 对.vue文件进行加载的时候,如果开启了代码压缩会出来下面几种问题,做个记录. 丢失td结束标记,导致页面的布局错乱 input的属性type为text ...