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

Solution

后缀排序后,得到height数组

发现原串中的每个子串一定是某个后缀的前缀,且不同后缀的前缀对应原串的子串一定不同

那么考虑二分答案,即长度,如果有长度大于等于k的一段height大于等于二分的长度,那么说明存在长度大于等于二分的长度的一个子串出现至少k次

  1. #include<bits/stdc++.h>
  2. #define ui unsigned int
  3. #define ll long long
  4. #define db double
  5. #define ld long double
  6. #define ull unsigned long long
  7. const int MAXN=20000+10;
  8. int n,k,rk[MAXN],SA[MAXN],nxt[MAXN],cnt[MAXN],height[MAXN],s[MAXN];
  9. template<typename T> inline void read(T &x)
  10. {
  11. T data=0,w=1;
  12. char ch=0;
  13. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  14. if(ch=='-')w=-1,ch=getchar();
  15. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  16. x=data*w;
  17. }
  18. template<typename T> inline void write(T x,char ch='\0')
  19. {
  20. if(x<0)putchar('-'),x=-x;
  21. if(x>9)write(x/10);
  22. putchar(x%10+'0');
  23. if(ch!='\0')putchar(ch);
  24. }
  25. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  26. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  27. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  28. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  29. inline void GetSA()
  30. {
  31. int m=300;
  32. for(register int i=1;i<=n;++i)rk[i]=s[i];
  33. for(register int i=1;i<=n;++i)cnt[rk[i]]++;
  34. for(register int i=1;i<=m;++i)cnt[i]+=cnt[i-1];
  35. for(register int i=n;i>=1;--i)SA[cnt[rk[i]]--]=i;
  36. for(register int k=1,ps;k<=n;k<<=1)
  37. {
  38. ps=0;
  39. for(register int i=n-k+1;i<=n;++i)nxt[++ps]=i;
  40. for(register int i=1;i<=n;++i)
  41. if(SA[i]>k)nxt[++ps]=SA[i]-k;
  42. for(register int i=1;i<=m;++i)cnt[i]=0;
  43. for(register int i=1;i<=n;++i)cnt[rk[i]]++;
  44. for(register int i=1;i<=m;++i)cnt[i]+=cnt[i-1];
  45. for(register int i=n;i>=1;--i)SA[cnt[rk[nxt[i]]]--]=nxt[i];
  46. std::swap(rk,nxt);
  47. rk[SA[1]]=1;ps=1;
  48. for(register int i=2;i<=n;rk[SA[i]]=ps,++i)
  49. if(nxt[SA[i]]!=nxt[SA[i-1]]||nxt[SA[i]+k]!=nxt[SA[i-1]+k])ps++;
  50. if(ps>=n)break;
  51. m=ps;
  52. }
  53. for(register int i=1,j,k=0;i<=n;height[rk[i++]]=k)
  54. for(k=k?k-1:k,j=SA[rk[i]-1];s[i+k]==s[j+k];++k);
  55. }
  56. inline bool check(int len)
  57. {
  58. for(register int i=2,nt=1;i<=n;++i)
  59. {
  60. if(height[i]>=len)nt++;
  61. else nt=1;
  62. if(nt>=k)return true;
  63. }
  64. return false;
  65. }
  66. int main()
  67. {
  68. read(n);read(k);
  69. for(register int i=1;i<=n;++i)read(s[i]);
  70. GetSA();
  71. int l=1,r=n,ans=0;
  72. while(l<=r)
  73. {
  74. int mid=(l+r)>>1;
  75. if(check(mid))ans=mid,l=mid+1;
  76. else r=mid-1;
  77. }
  78. write(ans,'\n');
  79. return 0;
  80. }

【刷题】BZOJ 1717 [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. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

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

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

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

  4. BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)

    [题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=1717 [题目大意] 求一个最长的串,使得其在母串中出现的次数达到要求 [题解] 二分答案 ...

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

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...

  6. bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式【后缀自动机】

    就是后缀自动机的板子嘛..构造完自动机之后拓扑一下,记录size,对于size大于k的点和ans取max #include<iostream> #include<cstdio> ...

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

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

  8. 【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    [算法]后缀数组 [题解]后缀数组 由于m太大,先离散化. 然后处理SA和LCP. 最后用单调队列处理即可. 注意实际上队列头尾长度限制是K-1. 删队尾不要删过头 i≥K才能开始统计答案. #inc ...

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

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

随机推荐

  1. AtCoder:C - Nuske vs Phantom Thnook

    C - Nuske vs Phantom Thnook https://agc015.contest.atcoder.jp/tasks/agc015_c 题意: n*m的网格,每个格子可能是蓝色, 可 ...

  2. STM32的GUI库使用

    1. 实验平台使用百为的STM32F103开发板 2. 例程目录\百为stm32开发板光盘\stm32_gui_lib\Project\Embedded_GUI_Example\EWARM 3. 直接 ...

  3. quartz与Spring整合

    1.创建maven工程,导入spring和quartz相关依赖 2.创建任务类 3.在spring配置文件中配置任务类 4.在spring配置文件中配置JobDetail 5.在spring配置文件中 ...

  4. ajax跨域请求php

    在众多站群中,不同功能的系统使用独立的一个域名,各系统之间存在相互调用的关系.使用js的XMLHttpRequest调用其他域名提示跨域权限不足.有些可能认为都同属于同一个顶级域名或者说域名一模一样怎 ...

  5. 从golang的垃圾回收说起(上篇)

    本文来自网易云社区 1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic me ...

  6. PAT - L2-001. 紧急救援( Dijstra )

    - PAT - L2-001. 紧急救援 题目链接 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两 ...

  7. 传入中文参数-->服务器_转码的方法

    如果要传入 中文参数到 服务器 使用lr_convert_string_encoding()                            LR_ENC_SYSTEM_LOCALE ,  转为 ...

  8. 【Linux】Face Recognition的封装

    使用虹软的人脸识别 写了一个linux下的Face Recognition的封装,当作是练习. C++的封装,结合opencv,使用方便.https://github.com/zacario-li/F ...

  9. Using APIs in Your Ethereum Smart Contract with Oraclize

    Homepage Coinmonks HOMEFILTER ▼BLOCKCHAIN TUTORIALSCRYPTO ECONOMYTOP READSCONTRIBUTEFORUM & JOBS ...

  10. Appium基础环境搭建(windows)---基于python

    1  JDK安装 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装注意:安装 ...