POJ 3261 Milk Patterns(后缀数组+单调队列)
2024-08-27 20:03:50
题意
找出出现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 ;
}
最新文章
- 机器学习 - ML
- which、whereis、locate、find 命令用法
- 黄聪:HtmlAgilityPack教程案例
- web旋转式
- HBase HTablePool
- 写给自己的web总结——css篇(1)
- JavaScript定义函数
- Hadoop MapReduce Task Log 无法查看syslog问题
- C语言 &#183; 算年龄
- Awk 从入门到放弃(2)– 分隔符 学习笔记
- Tomcat之JSP运行原理之小试牛刀
- mysql索引详解(转)
- Web开发者需养成的8个好习惯
- linux 安装网络监控插件indicator-sysmonitor
- Deferred content load was not performed. To provide the content, subscribe to the View&#39;s QueryControl event
- lintcode-117-跳跃游戏 II
- 【转】requests、BeautifulSoup使用总结
- Tomcat运行流程
- 20160419 while练习,复习
- 【codeforces 546A】Soldier and Bananas
热门文章
- CDR中怎么绘制一个漂亮的球衣?
- Python安装遇到的问题
- Java入门基础—面向对象开发
- 洛谷T47092 作业_简单状压动归
- Codeforces Round #493 (Div. 1) B. Roman Digits 打表找规律
- 装饰器阶段性练习(题目)[转载http://www.cnblogs.com/linhaifeng/p/7278389.html]
- EntityFramework 一
- vue 删除某个元素和删除某些元素
- python中方法与函数的区别与联系
- 原生JS封装ajax以及request