题意:

给出n和k,n代表数字的个数,k代表你要求至少出现k次的,下面是n个数字,求出在其中至少出现k次的可重叠的子串的长度。

思路:

类似于1743但又不同于1743,思路大体上差不多,二分答案+判定。

还是分组,然后看每组的个数是否大于k就ok了。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>#define maxn 20005int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(int *r,int *sa,int n,int m)
{int i,j,p,*x=wa,*y=wb,*t;for(i=0;i<m;i++) ws[i]=0;for(i=0;i<n;i++) ws[x[i]=r[i]]++;for(i=1;i<m;i++) ws[i]+=ws[i-1];for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;for(j=1,p=1;p<n;j*=2,m=p){for(p=0,i=n-j;i<n;i++) y[p++]=i;for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<n;i++) wv[i]=x[y[i]];for(i=0;i<m;i++) ws[i]=0;for(i=0;i<n;i++) ws[wv[i]]++;for(i=1;i<m;i++) ws[i]+=ws[i-1];for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}return;
}
int rank[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{int i,j,k=0;for(i=1;i<=n;i++) rank[sa[i]]=i;for(i=0;i<n;height[rank[i++]]=k)for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);return;
}int check(int n,int k,int mid)
{int ans=1;//不能是0for(int i=1;i<=n;i++){if(height[i]>=mid){ans++;if(ans>=k)return 1;}elseans=1;}return 0;
}int main()
{//freopen("in.txt","r",stdin);int r[maxn],sa[maxn];int n,k;while(scanf("%d%d",&n,&k)!=EOF){for(int i=0;i<n;i++){scanf("%d",&r[i]);r[i]++;}r[n]=0;da(r,sa,n+1,200);calheight(r,sa,n);int min=1,max=n;while(min<=max){int mid=(min+max)/2;if(check(n,k,mid))min=mid+1;elsemax=mid-1;}printf("%d\n",max);}return 0;
}

poj3261(求至少出现k次的可重叠的子串的长度)相关推荐

  1. LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)

    1. 题目 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1示例 2: ...

  2. 【862. 和至少为 K 的最短子数组】

    来源:力扣(LeetCode) 描述:   给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度.如果不存在这样的 子数组 ,返回 ...

  3. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  4. 和至少为k的最短子数组 python_LeetCode 862. 和至少为 K 的最短子数组

    最近刷LeetCode题目的一些思路,题目信息 返回A 的最短的非空连续子数组的长度,该子数组的和至少为 K .如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1:输入:A = [1], K ...

  5. C++实现求数组中前K大的数

    参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...

  6. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数     {         //static size_t count = 0;          ...

  7. 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

    题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2<=n<=1000),a(2<=a<=1000) 输出: 一个整数. ...

  8. LeetCode算法系列_0862_和至少为K的最短子数组

    0862_和至少为 K 的最短子数组 题目描述 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例1: 输入:A = [1], ...

  9. C语言使用1到9求出所有k个数字的所有组合的算法(附完整源码)

    C语言使用1到9求出所有k个数字的所有组合的算法 C语言使用1到9求出所有k个数字的所有组合的算法完整源码(定义,实现,main函数测试) C语言使用1到9求出所有k个数字的所有组合的算法完整源码(定 ...

最新文章

  1. Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs
  2. Django中使用Celery
  3. win服务器系统程序原因分析
  4. SAP顾问,市场的双重需求
  5. 递归要素及太深导致堆栈溢出怎么办?
  6. SQL时间相关 - SQL日期,时间比较(转)
  7. php中的几个判断文件和目录的函数 is_file() is_dir() mkdir() file_exists()
  8. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
  9. java集合了类面试题_一些集合类面试题,说不定你就会遇到
  10. python使用 difflib 对比 两个文档 差异
  11. 值得推荐的在线报表设计器
  12. @UPC 6605 @福建OI2018 [FJOI2018] @ 洛谷 P4578 所罗门王的宝藏 (矩阵行列规律)
  13. 微信公众号开发:Java后台如何处理公众号关注和取关事件
  14. String fname=%e6%8e%88%e6%9d%832; url转码成中文
  15. photoshop快捷键大全
  16. iOS开发- 以图搜图功能实现 (源码+解析)
  17. 【数据集格式】coco格式转txt格式
  18. 【转】全国各地做生意十年的心得,忍不住上来感慨一下,诚信才是根基!
  19. AutoCAD Civil 3D-创建道路模型(2 道路的挖填方量计算及条件部件)
  20. angular学习总结-打包问题

热门文章

  1. 科大星云诗社动态20210814
  2. 通俗解释协方差与相关系数
  3. adf检验代码 python_第22期:向量自回归(VAR)模型预测——Python实现
  4. httos双向认证配置_HTTPS双向验证,如何设置
  5. IIR+双向滤波实现系统零相位相移_MATLAB仿真
  6. VS2015中配置MSComm通讯控件和注意事项
  7. c++中结构体字符指针成员无法赋值
  8. MySQL到Elasticsearch数据同步
  9. 解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义
  10. UNIX再学习 -- 错误和警告