题意:求最长的可重叠的 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. GitLab Container Registry

    通过将GitLab Container Registry集成到GitLab中,每个项目都可以拥有自己的空间来存储其Docker镜像. 1. 启用Container Registry 如果在你的项目的侧 ...

  2. 表关联使用INNER JOIN实现更新功能

    准备一些数据,创建2张表,表1为学生表: CREATE TABLE [dbo].[Student] ( [SNO] INT NOT NULL PRIMARY KEY, ) NOT NULL, ,) N ...

  3. mysql简单备份与恢复

    1.备份 mysqldump -u root -h 127.0.0.1 -p --set-gtid-purged=OFF  abc > /data/mysqlBak/abc_20200206.s ...

  4. css的三种导入方式

    内联样式表 <p style="font-size:50px; color:blue">css内联样式表</p> 内部样式表 <style type= ...

  5. vue更改数组中的值

    根据下标更改时 vm为新建的vue对象 ind为数组 第一个e为在数组ind中e索引位置 第二个e为更改为值e vm.$set(vm.ind,e,e) 常规更改 arr为数组 //添加 arr.pus ...

  6. css3神奇的圆角边框、阴影框及其图片边框

    css3圆角,建议IE10以上 如果border-radius 单位是百分比,则参考为自身宽高,因此当宽高不一致时,圆角为不规则形状 如果border-radius 为50%,则为椭圆:当宽高一致时, ...

  7. 【Spring】事务(transactional) - REQUIRES_NEW在JdbcTemplate、Mybatis中的不同表现

    环境 数据库: oracle 11g JAR: org.springframework:spring-jdbc:4.3.8.RELEASE org.mybatis:mybatis:3.4.2 概念 R ...

  8. echarts 【图表的基本使用】

    一.柱状图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  9. vsftp配置遇到的一些问题

    设置匿名登陆的时候,要保证 /var/ftp/ 的所有者 是root,不然会一直提示输入用户名和密码,无法登陆! 上传的权限 local_umask =002 以及 匿名用户 anon_umask=0 ...

  10. while语句的练习一

    今天学习了while语句,自己想了一道题,试着练习,改了几次之后调试通过: 学生做题,如果全部都做对了,那么会得到老师的夸奖,如果做错了,那么每道题要罚抄十遍: namespace _999_1错题罚 ...