link\

这是一道后缀匹配的模板题

我们只需要将height算出来

然后二分一下答案就可以了

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. using namespace std;
  6. const int maxn=1010000;
  7. int data[maxn];
  8. int rank[maxn];
  9. int tot[maxn];
  10. int sa[maxn];
  11. int pas[maxn];
  12. int len,n,m;
  13. int height[maxn];
  14. int k;
  15. void build_Sa()
  16. {
  17. m=150;
  18. for(int i=0;i<n;i++)
  19. rank[i]=data[i],tot[data[i]]+=1;
  20. for(int i=1;i<=m;i++)
  21. tot[i]+=tot[i-1];
  22. for(int i=n-1;i>=0;i--)
  23. sa[--tot[rank[i]]]=i;
  24. for(int k=1;k<=n;k<<=1)
  25. {
  26. int num=0;
  27. for(int i=n-k;i<n;i++) pas[num++]=i;
  28. for(int i=0;i<n;i++)
  29. if(sa[i]>=k) pas[num++]=sa[i]-k;
  30. for(int i=0;i<=m;i++) tot[i]=0;
  31. for(int i=0;i<n;i++) tot[rank[i]]+=1;
  32. for(int i=1;i<=m;i++) tot[i]+=tot[i-1];
  33. for(int i=n-1;i>=0;i--)
  34. sa[--tot[rank[pas[i]]]]=pas[i],pas[i]=0;
  35. swap(pas,rank);
  36. num=1;rank[sa[0]]=1;
  37. for(int i=1;i<n;i++)
  38. if(pas[sa[i]]!=pas[sa[i-1]]||pas[sa[i]+k]!=pas[sa[i-1]+k])
  39. rank[sa[i]]=++num;
  40. else
  41. rank[sa[i]]=num;
  42. if(num>=n) break;
  43. m=num;
  44. }
  45. }
  46. void build_LCP()
  47. {
  48. int h=0;
  49. /*for(int i=0;i<n;i++) pas[sa[i]]=i;
  50. for(int i=0;i<n;i++)
  51. {
  52. if(!pas[i]) continue;
  53. int j=sa[pas[i]-1];
  54. if(h) h--;
  55. while(data[j+h]==data[i+h]&&j+h<n&&i+h<n) h++;
  56. height[pas[i]]=h;
  57. }*/
  58. for(int i=0;i<n;i++)
  59. {
  60. if(rank[i]-1==0) continue;
  61. int j=sa[rank[i]-2];
  62. if(h) h-=1;
  63. while(j+h<n&&i+h<n)
  64. if(data[j+h]!=data[i+h]) break;
  65. else h+=1;
  66. height[rank[i]]=h;
  67. }
  68. }
  69. bool check(int val)
  70. {
  71. int now=0;
  72. for(int i=0;i<=n;i++)
  73. {
  74. if(height[i]>=val) now+=1;
  75. else now=0;
  76. if(now>=k-1) return true;
  77. }
  78. return false;
  79. }
  80. int main()
  81. {
  82. scanf("%d%d",&n,&k);
  83. for(int i=0;i<n;i++) scanf("%d",&data[i]);
  84. int l=1,r=n,mid;
  85. build_Sa();
  86. build_LCP();
  87. while(l+1<r)
  88. {
  89. mid=(l+r)>>1;
  90. if(check(mid)) l=mid;
  91. else r=mid-1;
  92. }
  93. printf("%d", check(r) ? r : l );
  94. }
  95. /*
  96. 8 2
  97. 1
  98. 2
  99. 3
  100. 2
  101. 3
  102. 2
  103. 3
  104. 1
  105. 12323231
  106. */

P2852 [USACO06DEC]牛奶模式Milk Patterns的更多相关文章

  1. [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns

    洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...

  2. luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描

    后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$    Code: #include <bits/stdc++.h> #d ...

  3. Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns

    题目链接 \(Click\) \(Here\) 水题.利用\(Height\)的性质维护一个单调栈即可. #include <bits/stdc++.h> using namespace ...

  4. 【后缀数组】【LuoguP2852】 [USACO06DEC]牛奶模式Milk Patterns

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

  5. [Luogu2852][USACO06DEC]牛奶模式Milk Patterns

    Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...

  6. [USACO06DEC] 牛奶模式Milk Patterns

    题目链接:戳我 我们知道后缀数组的h数组记录的是后缀i和后缀i-1的最长公共前缀长度,后缀的前缀其实就是子串. 因为是可以重复出现的子串,所以我们只要计算哪些h数组的长度大于等于x即可.这一步操作我们 ...

  7. 洛谷P2852 牛奶模式Milk Patterns [USACO06DEC] 字符串

    正解:SA/二分+哈希 解题报告: 传送门! umm像这种子串的问题已经算是比较套路的了,,,?就后缀的公共前缀这样儿的嘛QwQ 所以可以先求个SA 然后现在考虑怎么判断一个长度为d的子串出现了k次? ...

  8. 2018.07.17 牛奶模式Milk Patterns(二分+hash)

    传送门 一道简单的字符串.这里收集了几种经典做法: SAM,不想写. 后缀数组+二分,不想写 后缀数组+单调队列,不想写 hash+二分,for循哈希,天下无敌!于是妥妥的hash 代码如下: #in ...

  9. USACO06DEC 牛奶模式

    题意:求最长的可重叠的 K重复子串 的长度 考虑二分长度s,转化为验证性问题. 对SA进行分组.保证组内Height最小为s.这样在组内RMQ就可以任意了,因为RMQ一定是大于S的. 只要组内元素个数 ...

随机推荐

  1. 02-struts2结果常见的四种处理方式

    1 转发 <!--转发 --> <action name="Demo1Action" class="www.test.a_result.Demo1Act ...

  2. TOJ 3635 过山车

    Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找 个个男生做partne ...

  3. TerraBuilder创建地形之去除影像黑边,填充影像

    最近在Skyline项目中使用TerraBuilder创建地形,由于地形比较大,分块下载卫星影像,然后再TerraBuilder中合并,由于合并.图形等等问题,导致创建处理出来的地形中存在严重的缝隙和 ...

  4. wex5新增数据库

    首先是要打开Wex5   (这是废话,下面进入正题..) 1.第一步,找到界面中的 ”窗口” 点击打开,你会看到一个 “ 首选项 ”按照流程也要打开 (囧),,,,,,,,看图为重 2.当你打开了 “ ...

  5. [LeetCode]29. Divide Two Integers两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  6. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)

    当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作  把url中的图片文件下载到本地(或者上传到私有云中)  public String uploadUrlToOss ...

  7. hibernate事务管理 (jdbc jta)

    hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...

  8. 【代码笔记】Java基础:Java的方法和类

    面向过程与面向对象都是我们编程中,编写程序的一种思维方式.例如:公司打扫卫生(擦玻璃.扫地.拖地.倒垃圾等), 按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生 ...

  9. javascript对象(3)

    这个对象,不是那个对象,第三哦! 对象之间会存在继承,所以,来说一下他们之间存在的三种三种继承方式: 1.冒用继承 //创建了孙悟空构造函数 function Sun(change,weapon,gf ...

  10. 基于ArcGIS的CAD数据向GIS数据转换方法(转)

    基于ArcGIS的CAD数据向GIS数据转换方法 1 CAD数据与ArcGIS数据介绍 地图数据来源多种多样,大多数使用的是计算机辅助设计软件(CAD)制作的数据,CAD软件制图自动化程度高,操作简单 ...