题目链接

思路

K=2K = 2K=2时就是求height[i]height[i]height[i]的最大值。
K≠2K =\not 2K≠​2时就是连续K−1K-1K−1个height[i]height[i]height[i]的最小值的最大
可以二分枚举长度,每次O(n)O(n)O(n)判断解,时间复杂度O(nlogn)O(nlogn)O(nlogn)

#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 2e5 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
int cntA[maxn], cntB[maxn], A[maxn], B[maxn];
int Sa[maxn], tsa[maxn], height[maxn], Rank[maxn];
int s[maxn];
int n, k;
void suffixArray () {for (int i = 0; i < 256; ++i) cntA[i] = 0;for (int i = 1; i <= n; ++i) cntA[s[i]]++;for (int i = 1; i < 256; ++i) cntA[i] += cntA[i-1];for (int i = n; i >= 1; --i) Sa[ cntA[s[i]]-- ] = i;Rank[ Sa[1] ] = 1;for (int i = 2; i <= n; ++i) {Rank[Sa[i]] = Rank[Sa[i-1]];if (s[Sa[i]] != s[Sa[i-1]]) Rank[Sa[i]]++;}for (int l = 1; Rank[Sa[n]] < n; l <<= 1) {for (int i = 0; i <= n; ++i) cntA[i] = 0;for (int i = 0; i <= n; ++i) cntB[i] = 0;for (int i = 1; i <= n; ++i) {cntA[ A[i] = Rank[i] ]++;cntB[ B[i] = (i + l <= n) ? Rank[i+l] : 0]++;}for (int i = 1; i <= n; ++i) cntB[i] += cntB[i-1];for (int i = n; i >= 1; --i) tsa[ cntB[B[i]]-- ] = i;for (int i = 1; i <= n; ++i) cntA[i] += cntA[i-1];for (int i = n; i >= 1; --i) Sa[ cntA[A[tsa[i]]]-- ] = tsa[i];Rank[ Sa[1] ] = 1;for (int i = 2; i <= n; ++i) {Rank[Sa[i]] = Rank[Sa[i-1]];if (A[Sa[i]] != A[Sa[i-1]] || B[Sa[i]] != B[Sa[i-1]]) Rank[Sa[i]]++;}}for (int i = 1, j = 0; i <= n; ++i) {if (j) --j;int tmp = Sa[Rank[i] - 1];while (i + j <= n && tmp + j <= n && s[i+j] == s[tmp+j]) ++j;height[Rank[i]] = j;}
}
int check(int x) {int cnt = 0;for (int i = 1; i <= n; ++i) {if (height[i] >= x) cnt++;else {if (cnt >= k) return 1;cnt = 0;}}return 0;
}
int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> k;k--;for (int i = 1; i <= n; ++i) {cin >> s[i];}suffixArray();int l = 1, r = n;while (l <= r) {if (check(mid)) l = mid + 1;else r = mid - 1;}cout << r << endl;return 0;
}

#1403 : 后缀数组一·重复旋律 (可重叠最长重复K次子串问题)相关推荐

  1. #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)

    题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...

  2. 后缀数组--(可重叠最长重复子串问题)

    问题描述:给定一个字符串,求最长重复子串,这两个子串可以重叠. 其实问题可以转化为height数组的最大值.至于为什么是这样,我可以这样解释: 求可重叠最长重复子串等价于求两个后缀的最长公共前缀的最大 ...

  3. POJ 1743 (后缀数组+不重叠最长重复子串)

    题目链接: http://poj.org/problem?id=1743 题目大意:楼教主の男人八题orz.一篇钢琴谱,每个旋律的值都在1~88以内.琴谱的某段会变调,也就是说某段的数可以加减一个旋律 ...

  4. poj1743(后缀数组+二分--不可重叠最长重复子串)

    题目:Musical Theme #include <stdio.h> #include <string.h> #define N 1000010 int wa[N],wb[N ...

  5. c++ 字符串数组长度排序_数组 | 后缀数组的求法及应用

    作者:Andy__lee 链接:https://blog.nowcoder.net/n/6b4a93e186ed4a358321de6a7c3b4f19 来源:牛客网 定义 维基百科 - 后缀数组 让 ...

  6. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  7. 试题 算法训练 后缀数组——最长重复子串

    资源限制 时间限制:100ms 内存限制:256.0MB 问题描述 给定一个长度为n的数串,求至少出现k 次的最长重复子串的长度,这k 个子串可以重叠.保证有子串出现至少k次. 输入格式 第一行:两个 ...

  8. 后缀数组总结(转载)

    后缀数组--处理字符串的有力工具 作者:罗穗骞 2009年1月 [摘要] 后缀数组是处理字符串的有力工具.后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间 ...

  9. Musical Theme POJ - 1743(后缀数组+二分)

    求不可重叠最长重复子串 对于height[i]定义为sa[i]和 sa[i-1]的最长公共前缀 这个最长公共前缀的值肯定是最大的 证明: 设rank[j] < rank[k], 则不难证明后缀j ...

最新文章

  1. 从今天开始,自己做SEO。
  2. 数据挖掘 概念与技术(原书第3版)
  3. x的平方根—leetcode69
  4. C++ 避免内存泄漏
  5. SQLServer用存储过程实现插入更新数据
  6. 笔记41 Spring Web Flow——Demo
  7. 中国恒大拟出售恒大汽车2.66%股权 配股金额约106亿港元
  8. 2021高通人工智能应用创新大赛踩坑指南
  9. Linux知识--初始linux
  10. FPGA————构建3*3矩阵实现每一列求和
  11. 0x0 Transaction mined but execution failed
  12. 编程之美---电梯调度算法
  13. [iOS]申请苹果开发账号
  14. 1.8W字MySQL超全笔面试题(含答案) 1月最新整理 .NET开发者必看
  15. C++动态爱心 520 七夕情人节整活
  16. 全球及中国医疗听力计行业市场消费量调研及未来投资研究报告2022-2028年
  17. DiI(细胞膜红色荧光探针)被广泛应用于神经等细胞或组织的示踪剂或长期示踪剂
  18. 租服务器一年多少钱,阿里云服务器租赁一年多少钱...
  19. mysql分表技巧_MySQL分表操作的方法分析
  20. 网络安全--入侵阶段介绍

热门文章

  1. Android 圆形/圆角图片的方法
  2. 数据库SQL语句学习笔记(4)-过滤数据
  3. Django1.7学习(二)
  4. MS-SQL中的事务
  5. python 彩票 遗漏值_荐Python遗漏知识点一
  6. [Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结
  7. [python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决
  8. [python知识] 爬虫知识之BeautifulSoup库安装及简单介绍
  9. HarmonyOS之常用组件Button的功能和使用
  10. OpenGL之仿“天体”运动渲染球体之间的旋转效果