【链接】h在这里写链接


【题意】


给你一个长度为n的序列。

问你能不能在其中找到一个最长的子串。

    这个子串至少出现了k次.

【题解】


长度越长,就越不可能出现k次

后缀数组+二分。

N最大为20000;

每个数字在0到1e5之间

防止出错,把那个数字都加上1就好
(因为N比每个数字的大小来的小,所以需要把N也开到1E5以上。)

【错的次数】


0

【反思】


在这了写反思

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. const int N = 2e5;
  6. const int MAX_CHAR = 1e5+10;//每个数字的最大值。
  7. int s[N + 10];//如果是数字,就写成int s[N+10]就好,从0开始存
  8. int Sa[N + 10], T1[N + 10], T2[N + 10], C[N + 10];
  9. int Height[N + 10], Rank[N + 10];
  10.  
  11. void build_Sa(int n, int m) {
  12. int i, *x = T1, *y = T2;
  13. for (i = 0; i<m; i++) C[i] = 0;
  14. for (i = 0; i<n; i++) C[x[i] = s[i]]++;
  15. for (i = 1; i<m; i++) C[i] += C[i - 1];
  16. for (i = n - 1; i >= 0; i--) Sa[--C[x[i]]] = i;
  17. for (int k = 1; k <= n; k <<= 1)
  18. {
  19. int p = 0;
  20. for (i = n - k; i<n; i++) y[p++] = i;
  21. for (i = 0; i<n; i++) if (Sa[i] >= k) y[p++] = Sa[i] - k;
  22. for (i = 0; i<m; i++) C[i] = 0;
  23. for (i = 0; i<n; i++) C[x[y[i]]]++;
  24. for (i = 1; i<m; i++) C[i] += C[i - 1];
  25. for (i = n - 1; i >= 0; i--) Sa[--C[x[y[i]]]] = y[i];
  26. swap(x, y);
  27. p = 1; x[Sa[0]] = 0;
  28. for (i = 1; i<n; i++)
  29. x[Sa[i]] = y[Sa[i - 1]] == y[Sa[i]] && y[Sa[i - 1] + k] == y[Sa[i] + k] ? p - 1 : p++;
  30. if (p >= n) break;
  31. m = p;
  32. }
  33. }
  34.  
  35. void getHeight(int n)
  36. {
  37. int i, j, k = 0;
  38. for (i = 1; i <= n; i++) Rank[Sa[i]] = i;
  39. for (i = 0; i<n; i++) {
  40. if (k) k--;
  41. j = Sa[Rank[i] - 1];
  42. while (s[i + k] == s[j + k]) k++;
  43. Height[Rank[i]] = k;
  44. }
  45. }
  46.  
  47. int n, k;
  48.  
  49. bool ok(int l)
  50. {
  51. int cnt = 0;
  52. for (int i = 2; i <= n; i++)
  53. if (Height[i] >= l)
  54. {
  55. cnt++;
  56. if (cnt >= k - 1) return true;
  57. }
  58. else
  59. {
  60. cnt = 0;
  61. }
  62. return false;
  63. }
  64.  
  65. int main()
  66. {
  67. //freopen("F:\\rush.txt", "r", stdin);
  68. scanf("%d%d", &n, &k);
  69. for (int i = 0; i < n; i++)
  70. {
  71. scanf("%d", &s[i]);
  72. s[i]++;
  73. }
  74. s[n] = 0;
  75. build_Sa(n + 1, MAX_CHAR);
  76. getHeight(n);
  77.  
  78. int l = 1, r = n, temp = 0;
  79. while (l <= r)
  80. {
  81. int mid = (l + r) >> 1;
  82. if (ok(mid))
  83. {
  84. temp = mid;
  85. l = mid + 1;
  86. }
  87. else
  88. r = mid - 1;
  89. }
  90. printf("%d\n", temp);
  91. return 0;
  92. }

【POJ 3261】Milk Patterns的更多相关文章

  1. 【poj 3261】Milk Patterns 后缀数组

    Milk Patterns 题意 给出n个数字,以及一个k,求至少出现k次的最长子序列的长度 思路 和poj 1743思路差不多,二分长度,把后缀分成若干组,每组任意后缀公共前缀都>=当前二分的 ...

  2. 【POJ 3261】Milk Patterns 可重叠的k次最长重复子串

    可重叠的k次最长重复子串 #include<cstdio> #include<cstring> #include<algorithm> using namespac ...

  3. 【POJ 3167】Cow Patterns (KMP+树状数组)

    Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...

  4. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  5. 【BZOJ1717&POJ3261】Milk Patterns(后缀数组,二分)

    题意:求字符串的可重叠的k次最长重复子串 n<=20000 a[i]<=1000000 思路:后缀数组+二分答案x,根据height分组,每组之间的height>=x 因为可以重叠, ...

  6. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  7. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  8. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  9. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

随机推荐

  1. [转]C# 委托、事件,lamda表达式

    1. 委托Delegate C#中的Delegate对应于C中的指针,但是又有所不同C中的指针既可以指向方法,又可以指向变量,并且可以进行类型转换, C中的指针实际上就是内存地址变量,他是可以直接操作 ...

  2. [转]基于MefBootstrapper的Bootstrapper

    public class Bootstrapper : MefBootstrapper    {        ModuleCatalog moduleCatalog; protected overr ...

  3. 廖雪峰Java10加密与安全-5签名算法-2DSA签名算法

    DSA DSA:Digital Signature Algorithm,使用EIGamal数字签名算法,和RSA数字签名相比,DSA更快. DSA只能配合SHA使用: SHA1withDSA SHA2 ...

  4. day43作业

    注册页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. Mybatis框架+原理

    https://www.cnblogs.com/luoxn28/p/6417892.html(转载,蛮详细的)

  6. vue.js_05_vue.js的过滤器

    1.过滤器的定义和使用 实现:将页面的中的单纯替换成,用户传来的文字. 全局过滤器:所有的Vue对象都可以使用 <body> <div id="app"> ...

  7. spring cloud深入学习(八)-----配置中心svn示例和refresh

    svn版本 同样先示例server端的代码,基本步骤一样. 1.添加依赖 <dependencies> <dependency> <groupId>org.spri ...

  8. Jmeter分布式测试笔记

    在性能测试过程中,如果要求并发数较大时(例如1000+),单机配置cpu与内存等无法支持,则需要使用Jmeter的分布式测试方法. 一.一般什么情况下需要分布式 1.前辈经验:比如机器i5双核的cpu ...

  9. 玩转vue的slot内容分发

    vue的内容分发非常适合"固定部分+动态部分"的组件的场景,固定部分可以是结构固定,也可以是逻辑固定,比如下拉loading,下拉loading只是中间内容是动态的,而拉到底部都会 ...

  10. kuangbin带我飞QAQ 最短路

    1. poj 1502 Mathches Game 裸最短路 #include <iostream> #include <string.h> #include <cstd ...