题意:求最长的可重叠的 K重复子串 的长度

考虑二分长度s,转化为验证性问题。

对SA进行分组。保证组内Height最小为s。这样在组内RMQ就可以任意了,因为RMQ一定是大于S的。

只要组内元素个数大于等于K就是可行解。

 #include <bits/stdc++.h>
using namespace std; struct SA{
int str[];
int x[],y[],u[],v[],r[],o[],hei[],m=,n; int a[]; void build(int p,int l,int r){
if(l==r) a[p]=hei[l];
else build(p*,l,(l+r)/), build(p*+,(l+r)/+,r), a[p]=min(a[p*],a[p*+]);
} int query(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql) return 1e+;
if(l>=ql&&r<=qr) return a[p];
return min(query(p*,l,(l+r)/,ql,qr),query(p*+,(l+r)/+,r,ql,qr));
} void calc(){
int i,j,k=;
//for(i=1; i<=n; i++) r[x[i]]=i;
for(i=; i<=n; hei[r[i++]]=k)
for(k?k--:,j=x[r[i]-]; str[i+k]==str[j+k]; k++);
} int solve(){
//n=strlen(str+1);
//printf("len %d\n",n); for(int i=;i<=n;i++) u[str[i]]++;
for(int i=;i<=m;i++) u[i]+=u[i-];
for(int i=n;i>=;i--) x[u[str[i]]--]=i;
r[x[]]=;
for(int i=;i<=n;i++) r[x[i]]=r[x[i-]]+((str[x[i]]-str[x[i-]])?:); for(int l=;r[x[n]]<n;l<<=) {
memset(u,,sizeof u);
memset(v,,sizeof v);
memcpy(o,r,sizeof r);
for(int i=;i<=n;i++) u[r[i]]++, v[(i+l<=n)?r[i+l]:]++;
for(int i=;i<=n;i++) u[i]+=u[i-], v[i]+=v[i-];
for(int i=n;i>=;i--) y[v[(i+l<=n)?r[i+l]:]--]=i;
for(int i=n;i>=;i--) x[u[r[y[i]]]--]=y[i];
r[x[]]=;
for(int i=;i<=n;i++)
r[x[i]]=r[x[i-]]+((o[x[i]] != o[x[i-]]) || (((x[i]+l<=n)?o[x[i]+l]:) != ((x[i-]+l<=n)?o[x[i-]+l]:)));
}
calc();
hei[]=;
//build(1,1,n);
} int lcp(int pos1,int pos2){
return query(,,n,min(r[pos1],r[pos2])+,max(r[pos1],r[pos2]));
} } sa; int n,k; int main(){
cin>>n>>k;
sa.n=n;
for(int i=;i<=n;i++) cin>>sa.str[i];
sa.solve();
int l=,r=,ans=;
while(r-l) {
int s=(l+r)/,cnt=,mx=;
for(int i=;i<=n+;i++)
if(sa.hei[i]<s)
mx=max(cnt,mx), cnt=;
else cnt++;
if(mx>=k) ans=max(ans,s), l=s+;
else r=s;
}
cout<<ans<<endl; }

USACO06DEC 牛奶模式的更多相关文章

  1. [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns

    洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...

  2. luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描

    后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$    Code: #include <bits/stdc++.h> #d ...

  3. 【后缀数组】【LuoguP2852】 [USACO06DEC]牛奶模式Milk Patterns

    题目链接 题目描述 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". J ...

  4. [Luogu2852][USACO06DEC]牛奶模式Milk Patterns

    Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...

  5. Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns

    题目链接 \(Click\) \(Here\) 水题.利用\(Height\)的性质维护一个单调栈即可. #include <bits/stdc++.h> using namespace ...

  6. [USACO06DEC] 牛奶模式Milk Patterns

    题目链接:戳我 我们知道后缀数组的h数组记录的是后缀i和后缀i-1的最长公共前缀长度,后缀的前缀其实就是子串. 因为是可以重复出现的子串,所以我们只要计算哪些h数组的长度大于等于x即可.这一步操作我们 ...

  7. P2852 [USACO06DEC]牛奶模式Milk Patterns

    link 这是一道后缀匹配的模板题 我们只需要将height算出来 然后二分一下答案就可以了 #include<cstdio> #include<algorithm> #inc ...

  8. 洛谷P2852 牛奶模式Milk Patterns [USACO06DEC] 字符串

    正解:SA/二分+哈希 解题报告: 传送门! umm像这种子串的问题已经算是比较套路的了,,,?就后缀的公共前缀这样儿的嘛QwQ 所以可以先求个SA 然后现在考虑怎么判断一个长度为d的子串出现了k次? ...

  9. 2018.07.17 牛奶模式Milk Patterns(二分+hash)

    传送门 一道简单的字符串.这里收集了几种经典做法: SAM,不想写. 后缀数组+二分,不想写 后缀数组+单调队列,不想写 hash+二分,for循哈希,天下无敌!于是妥妥的hash 代码如下: #in ...

随机推荐

  1. BFC的语法

    先说一下什么是BFC(Block Formatting Contexts) BFC:块级格式化上下文(独立的渲染区).通俗的说是块级元素布局逻辑或规则,想要触发BFC就要是块级元素,要不把它转为块级元 ...

  2. 理解一致性Hash算法

    简介 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CAR ...

  3. Linux学习记录(一):常用命令

    此篇文章为博主在Linux学习过程中的一些记录,记录在此方便查阅. 常用命令总结 ls 显示目录内容 (list directory contents) ls 不显示隐藏的文件和子目录 ls -a 显 ...

  4. 【Android】WebDav For Android

    最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用. 服务器提供商是使用国内的坚果云,还是非常良心的. 坚果云官网:https://w ...

  5. elsearch搜索引擎 + painless脚本语言入门

    最近项目用到了elsearch,ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎. 自从版本6.0之后,其默认脚本语言变为 painless . ...

  6. centos安装gitlab及汉化

    GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.今天,就记录一下centos部署gitlab及其汉化的操作方法. 1.下载安装 下载地址: ...

  7. Upx 压缩go编译的程序 frp

    1. frp 程序占用大 .路由器 不够空间 2. UPX 下载地址       https://github.com/upx/upx/releases/ 3.  压缩命令  upx.exe -9 C ...

  8. Maximum Element In A Stack Gym - 102222A【思维+栈】

    2018-2019 ACM-ICPC, China Multi-Provincial Collegiate Programming Contest https://vjudge.net/problem ...

  9. 洛谷题解 P1024 【一元三次方程求解】

    原题传送门 题目描述 有形如:ax^3+bx^2+cx^1+dx^0=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至10 ...

  10. 转: Laravel的数据库迁移 介绍的比较清晰

    原文: https://blog.sbot.io/articles/12/Laravel-数据库迁移(Database-Migrations)操作实例 很多人可能在学习Laravel框架的时候,对La ...