题意

找出出现k次的可重叠的最长子串的长度

题解

用后缀数组。

然后求出heigth数组。

跑单调队列就行了。找出每k个数中最小的数的最大值。就是个滑动窗口啊

(不知道为什么有人写二分,其实写啥都差不多快,可能是因为二分是一个常见的模型吧)

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int n,m,x[N],sa[N],c[N],k,height[N],rk[N],y[N],ans,q[N],head,tail,s[N];
void get_sa(){
for(int i=;i<=n;i++)c[x[i]=s[i]]++;
for(int i=;i<=m;i++)c[i]+=c[i-];
for(int i=n;i>=;i--)sa[c[x[i]]--]=i;
for(int k=;k<=n;k<<=){
int num=;
for(int i=n-k+;i<=n;i++)y[++num]=i;
for(int i=;i<=n;i++)if(sa[i]>k)y[++num]=sa[i]-k;
for(int i=;i<=m;i++)c[i]=;
for(int i=;i<=n;i++)c[x[i]]++;
for(int i=;i<=m;i++)c[i]+=c[i-];
for(int i=n;i>=;i--)sa[c[x[y[i]]]--]=y[i],y[i]=;
for(int i=;i<=n;i++){
swap(x[i],y[i]);
}
x[sa[]]=;num=;
for(int i=;i<=n;i++){
x[sa[i]]=(y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k])?num:++num;
}
if(n==num)break;
m=num;
}
}
void get_height(){
for(int i=;i<=n;i++)rk[sa[i]]=i;
int k=;
for(int i=;i<=n;i++){
if(rk[i]==)continue;
if(k)k--;
int j=sa[rk[i]-];
while(j+k<=n&&i+k<=n&&s[j+k]==s[i+k])k++;
height[rk[i]]=k;
}
}
int main(){
scanf("%d%d",&n,&k);
if(k==){
printf("%d",n);
return ;
}
m=;
for(int i=;i<=n;i++){
scanf("%d",&s[i]);
}
get_sa();
get_height();
head=;tail=;
for(int i=;i<=k;i++){
while(height[i]<=height[q[tail]]&&head<=tail)tail--;
q[++tail]=i;
}
ans=height[q[head]];
for(int i=k+;i<=n;i++){
while(q[head]<=i-k+&&head<=tail)head++;
while(height[i]<=height[q[tail]]&&head<=tail)tail--;
q[++tail]=i;
ans=max(ans,height[q[head]]);
}
printf("%d",ans);
return ;
}

最新文章

  1. 机器学习 - ML
  2. which、whereis、locate、find 命令用法
  3. 黄聪:HtmlAgilityPack教程案例
  4. web旋转式
  5. HBase HTablePool
  6. 写给自己的web总结——css篇(1)
  7. JavaScript定义函数
  8. Hadoop MapReduce Task Log 无法查看syslog问题
  9. C语言 &#183; 算年龄
  10. Awk 从入门到放弃(2)– 分隔符 学习笔记
  11. Tomcat之JSP运行原理之小试牛刀
  12. mysql索引详解(转)
  13. Web开发者需养成的8个好习惯
  14. linux 安装网络监控插件indicator-sysmonitor
  15. Deferred content load was not performed. To provide the content, subscribe to the View&#39;s QueryControl event
  16. lintcode-117-跳跃游戏 II
  17. 【转】requests、BeautifulSoup使用总结
  18. Tomcat运行流程
  19. 20160419 while练习,复习
  20. 【codeforces 546A】Soldier and Bananas

热门文章

  1. CDR中怎么绘制一个漂亮的球衣?
  2. Python安装遇到的问题
  3. Java入门基础—面向对象开发
  4. 洛谷T47092 作业_简单状压动归
  5. Codeforces Round #493 (Div. 1) B. Roman Digits 打表找规律
  6. 装饰器阶段性练习(题目)[转载http://www.cnblogs.com/linhaifeng/p/7278389.html]
  7. EntityFramework 一
  8. vue 删除某个元素和删除某些元素
  9. python中方法与函数的区别与联系
  10. 原生JS封装ajax以及request