USACO06DEC 牛奶模式
题意:求最长的可重叠的 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 牛奶模式的更多相关文章
- [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns
洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...
- luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描
后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$ Code: #include <bits/stdc++.h> #d ...
- 【后缀数组】【LuoguP2852】 [USACO06DEC]牛奶模式Milk Patterns
题目链接 题目描述 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". J ...
- [Luogu2852][USACO06DEC]牛奶模式Milk Patterns
Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...
- Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
题目链接 \(Click\) \(Here\) 水题.利用\(Height\)的性质维护一个单调栈即可. #include <bits/stdc++.h> using namespace ...
- [USACO06DEC] 牛奶模式Milk Patterns
题目链接:戳我 我们知道后缀数组的h数组记录的是后缀i和后缀i-1的最长公共前缀长度,后缀的前缀其实就是子串. 因为是可以重复出现的子串,所以我们只要计算哪些h数组的长度大于等于x即可.这一步操作我们 ...
- P2852 [USACO06DEC]牛奶模式Milk Patterns
link 这是一道后缀匹配的模板题 我们只需要将height算出来 然后二分一下答案就可以了 #include<cstdio> #include<algorithm> #inc ...
- 洛谷P2852 牛奶模式Milk Patterns [USACO06DEC] 字符串
正解:SA/二分+哈希 解题报告: 传送门! umm像这种子串的问题已经算是比较套路的了,,,?就后缀的公共前缀这样儿的嘛QwQ 所以可以先求个SA 然后现在考虑怎么判断一个长度为d的子串出现了k次? ...
- 2018.07.17 牛奶模式Milk Patterns(二分+hash)
传送门 一道简单的字符串.这里收集了几种经典做法: SAM,不想写. 后缀数组+二分,不想写 后缀数组+单调队列,不想写 hash+二分,for循哈希,天下无敌!于是妥妥的hash 代码如下: #in ...
随机推荐
- GitLab Container Registry
通过将GitLab Container Registry集成到GitLab中,每个项目都可以拥有自己的空间来存储其Docker镜像. 1. 启用Container Registry 如果在你的项目的侧 ...
- 表关联使用INNER JOIN实现更新功能
准备一些数据,创建2张表,表1为学生表: CREATE TABLE [dbo].[Student] ( [SNO] INT NOT NULL PRIMARY KEY, ) NOT NULL, ,) N ...
- mysql简单备份与恢复
1.备份 mysqldump -u root -h 127.0.0.1 -p --set-gtid-purged=OFF abc > /data/mysqlBak/abc_20200206.s ...
- css的三种导入方式
内联样式表 <p style="font-size:50px; color:blue">css内联样式表</p> 内部样式表 <style type= ...
- vue更改数组中的值
根据下标更改时 vm为新建的vue对象 ind为数组 第一个e为在数组ind中e索引位置 第二个e为更改为值e vm.$set(vm.ind,e,e) 常规更改 arr为数组 //添加 arr.pus ...
- css3神奇的圆角边框、阴影框及其图片边框
css3圆角,建议IE10以上 如果border-radius 单位是百分比,则参考为自身宽高,因此当宽高不一致时,圆角为不规则形状 如果border-radius 为50%,则为椭圆:当宽高一致时, ...
- 【Spring】事务(transactional) - REQUIRES_NEW在JdbcTemplate、Mybatis中的不同表现
环境 数据库: oracle 11g JAR: org.springframework:spring-jdbc:4.3.8.RELEASE org.mybatis:mybatis:3.4.2 概念 R ...
- echarts 【图表的基本使用】
一.柱状图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- vsftp配置遇到的一些问题
设置匿名登陆的时候,要保证 /var/ftp/ 的所有者 是root,不然会一直提示输入用户名和密码,无法登陆! 上传的权限 local_umask =002 以及 匿名用户 anon_umask=0 ...
- while语句的练习一
今天学习了while语句,自己想了一道题,试着练习,改了几次之后调试通过: 学生做题,如果全部都做对了,那么会得到老师的夸奖,如果做错了,那么每道题要罚抄十遍: namespace _999_1错题罚 ...