题意:求最长的可重叠的 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. 1Python学习CentOS 7 Linux环境搭建

    鉴于python3目前已成流行之势,而各发行版Linux依然是自带python2.x,笔者尝试在centos7下,部署Python3.x与2.x共存环境 本文参考博主良哥95网址https://blo ...

  2. Java自学-多线程 常见线程方法

    Java 常见的线程方法 示例 1 : 当前线程暂停 Thread.sleep(1000); 表示当前线程暂停1000毫秒 ,其他线程不受影响 Thread.sleep(1000); 会抛出Inter ...

  3. 微信小程序入门笔记-账号注册(1)

    小程序注册 微信小程序开发之前,必须先有小程序账号,下面是注册步骤: 1.打开网页 微信公众平台https://mp.weixin.qq.com/,点击立即注册按钮 2.注册类型 选择小程序开发 3. ...

  4. 算法训练 最大获利 注意数据规模(long long)

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 Chakra是一位年轻有为的企业家,最近他在进军餐饮行业.他在各地开拓市场,共买下了N个饭店.在初期的市场调研中,他将一天划分为M ...

  5. pycharm的这些配置,你都知道吗

    前言 对于一枚pycharm工具的使用新手,正确了解这门工具的配置,在使用过程中遇到的很多问题也可以迎刃而解哦!! 文章篇幅有限,本篇文章提供以下配置手段: 1.字体大小调整 2.显示你需要的工具窗口 ...

  6. C语言 putchar

    C语言 putchar putchar主要功能是输出一个char.可以根据ASLL号码输出对应字符 案例 #define _CRT_SECURE_NO_WARNINGS #include <st ...

  7. 一个抓猫的游戏 消遣GAME 持续更新中!

    一个抓猫的游戏 版本 Catch_Cat_V0.30 https://files-cdn.cnblogs.com/files/send-off-a-friend/Catch_Cat_V0.3.rar ...

  8. laravel手动数组分页

    laravel文档中已经有写如何自己使用分页类去分页了,但没有详细说明. 如果你想手动创建分页实例并且最终得到一个数组类型的结果,可以根据需求来创建 IlluminatePaginationPagin ...

  9. NODEJS 使用 sqlite3 本地文件数据库

    npm install sqlite3 var sqlite3 = require('sqlite3').verbose();var db = new sqlite3.Database('WebFil ...

  10. pyjsonrpc的使用

    pyjsonrpc的使用 客户端 JsonRpcClient.py #!usr/bin/env python2.7 # -*- coding: utf-8 -*- import ssl import ...