题目

给定一个长度为\(n\)的字符串,求出现至少\(k\)次的最长子串长度


分析

由于后缀排序后的LCP才是最长的,既然要求至少\(k\)次,

实际上也就是维护长度为\(k\)的height数组最小值,可以用单调队列实现


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define rr register
using namespace std;
const int N=20011; int ans;
int C[N],sa[N],tp[N],rk[N],height[N],n;
int M,m,k,a[N],b[N],head,tail,q[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void SSort(){
for (rr int i=0;i<=M;++i) C[i]=0;
for (rr int i=1;i<=n;++i) ++C[rk[tp[i]]];
for (rr int i=1;i<=M;++i) C[i]+=C[i-1];
for (rr int i=n;i;--i) sa[C[rk[tp[i]]]--]=tp[i];
}
inline void Suffix_Array(){
for (rr int i=1;i<=n;++i) rk[i]=a[i],tp[i]=i;
M=m; SSort();
for (rr int len=1,p=1;p<n;M=p,len<<=1){
p=0;
for (rr int i=n-len+1;i<=n;++i) tp[++p]=i;
for (rr int i=1;i<=n;++i) if (sa[i]>len) tp[++p]=sa[i]-len;
SSort(),swap(tp,rk),rk[sa[1]]=p=1;
for (rr int i=2;i<=n;++i) rk[sa[i]]=(p+=tp[sa[i]]!=tp[sa[i-1]]||tp[sa[i]+len]!=tp[sa[i-1]+len]);
}
rr int j=0,k;
for (rr int i=1;i<=n;height[rk[i]]=j,++i)
for (j=j+!j-1,k=sa[rk[i]-1];a[i+j]==a[j+k];++j);
}
signed main(){
n=iut(),k=iut();
for (rr int i=1;i<=n;++i) b[i]=a[i]=iut();
sort(b+1,b+1+n),m=unique(b+1,b+1+n)-b-1;
for (rr int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+m,a[i])-b;
Suffix_Array(),head=1;
for (rr int i=1;i<=n;++i){
while (head<=tail&&q[head]<=i-k+1) ++head;
while (head<=tail&&height[q[tail]]>=height[i]) --tail; q[++tail]=i;
if (i>=k-1&&head<=tail) ans=max(ans,height[q[head]]);
}
return !printf("%d",ans);
}

#后缀数组,单调队列#洛谷 2852 [USACO06DEC]Milk Patterns G的更多相关文章

  1. 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)

    洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...

  2. hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  3. BZOJ_4698_Sdoi2008 Sandy的卡片_后缀数组+单调队列+双指针

    BZOJ_4698_Sdoi2008 Sandy的卡片_后缀数组 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是 ...

  4. POJ 3261 Milk Patterns(后缀数组+单调队列)

    题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ...

  5. BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...

  6. poj3415 Common Substrings (后缀数组+单调队列)

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9414   Accepted: 3123 Description A sub ...

  7. 洛谷 P5837 [USACO19DEC]Milk Pumping G (单源最短路,dijkstra)

    题意:有一\(n\)个点,\(m\)条边的双向图,每条边都有花费和流量,求从\(1\)~\(n\)的路径中,求\(max\frac{min(f)}{\sum c}\). 题解:对于c,一定是单源最短路 ...

  8. BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)

    BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...

  9. 【BZOJ-3238】差异 后缀数组 + 单调栈

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1561  Solved: 734[Submit][Status] ...

  10. BZOJ_3879_SvT_后缀数组+单调栈

    BZOJ_3879_SvT_后缀数组+单调栈 Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个 ...

随机推荐

  1. django的orm多表查询作业第五题答案

    5.每个作者出版的所有书的最高价格以及最高价格的那本书的名称. 用django的模型类写不出来的,只能用原生sql写这题 关于第五题,mysql5.7及以上版本,使用下面的答案 set sql_mod ...

  2. python操作txt文件,去除文件中的隔行空行

    conn = re.sub(result, '\r\n', content) res = "".join( [s for s in conn.strip().splitlines( ...

  3. 【Azure 服务总线】Azure.Messaging.ServiceBus 多次发送消息报超时错误,是否可以配置重新发送?是否有内置重试机制?

    问题描述 使用 Azure Service Bus,提供应用程序之间松耦合的消息交换,但是有时候发送消息多次出现超时错误. A connection attempt failed because th ...

  4. C++11的类型转换

    //C类型转换 /* C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理. 隐式类型:界定:相关类型,相近类型,意义相似的类 ...

  5. 如何在 C# 中以编程的方式将 CSV 转为 Excel XLSX 文件

    前言 Microsoft Excel的XLSX格式以及基于文本的CSV(逗号分隔值)格式,是数据交换中常见的文件格式.应用程序通过实现对这些格式的读写支持,可以显著提升性能.在本文中,小编将为大家介绍 ...

  6. 6. JVM本地方法

    1 本地方法 简单地讲,一个Native Method是一个Java调用非Java代码的接囗 一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C. 这个特征 ...

  7. Java 小练习(2) 利用面向对象的编程方法 设计类Circle计算圆的面积

    1 package com.bytezero.exer; 2 /*** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:420498 ...

  8. 用CFF Explorer隐藏文件格式

    1.首先我们加载两个PNG文件,可以看到 文件格式头部是一样的,我们如何将一个PDF文件格式改成PNG,修改之后的文件虽然含有图片的文件头格式,但是并不能打开. 将PNG的文件头复制写入到PDF文件头 ...

  9. CUDA指针数组Kernel函数

    技术背景 在前面的一篇文章中,我们介绍了在C++中使用指针数组的方式实现的一个不规则的二维数组.那么如果我们希望可以在CUDA中也能够使用到这种类似形式的不规则的数组,有没有办法可以直接实现呢?可能过 ...

  10. tmux使用--同步多终端输入

    最近一直需要同时操作多个远程机器,就简单学习了下tmux的使用.tmux(terminal multiplexer)是终端复用神器.对多个窗格同时使用特别好用,同步操作多台机器特别方便. tmux安装 ...