Poj3261 Milk Patterns
题目传送门
题意:对一个字符串求一个最长的子串使得它至少出现k次
额,因为这个题目呢,他的字符集非常大(100W)
所以直接用SAM是不行了,我们考虑用离散化+SA,让后就可以分块rmq了
当然这样很麻烦,我们还是用SAM,但是儿子集合用map来存,这样空间就是O(n)的,时间多了一个log
#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<map>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 40005
using namespace std;
map<int,int> s[N];
int mx[N],sz[N],f[N],ans=0;
int n,m,lst=1,cnt=1,v[N],r[N];
inline int extend(int c){int p=lst,np=lst=++cnt,q,nq;mx[np]=mx[p]+1; sz[np]=1;for(;p&&!s[p][c];p=f[p]) s[p][c]=np;if(!p) return f[np]=1;q=s[p][c];if(mx[q]==mx[p]+1) f[np]=q;else{nq=++cnt;mx[nq]=mx[p]+1;f[nq]=f[q]; f[q]=f[np]=nq;s[nq]=s[q];for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;}
}
int main(){scanf("%d%d",&n,&m);for(int x,i=1;i<=n;++i,extend(x)) scanf("%d",&x);for(int i=1;i<=cnt;++i) ++v[mx[i]];for(int i=1;i<=n;++i) v[i]+=v[i-1];for(int i=cnt;i;--i) r[v[mx[i]]--]=i;for(int i=cnt;i;--i){sz[f[r[i]]]+=sz[r[i]];if(sz[r[i]]>=m) ans=max(ans,mx[r[i]]);}printf("%d\n",ans);
}
转载于:https://www.cnblogs.com/Extended-Ash/p/9477186.html
Poj3261 Milk Patterns相关推荐
- [POJ3261] Milk Patterns
LINK 此题的常规做法是 二分 + 后缀数组 ,但本蒟蒻还是习惯写 并查集 的做法 算法流程 1.离散化是肯定要有的,给的数据太大了,不离散化会RE 2.先跑一遍SA,把最重要的h数组求出来 3.把 ...
- [poj3261]Milk Patterns
求出后缀数组和height数组,然后二分答案后分组查询,一个块内如果有超过k个那么这个答案就可以. 1 #include<bits/stdc++.h> 2 using namespace ...
- POJ3261 Milk Patterns 【后缀数组】
牛奶模式 时间限制: 5000MS 内存限制: 65536K 提交总数: 16796 接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...
- P2852 [USACO06DEC]Milk Patterns G
题目描述 Farmer John has noticed that the quality of milk given by his cows varies from day to day. On f ...
- 后缀数组2.0--Height数组(bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式)
前置技能:后缀数组 height[i]:排名第i的后缀与排名第i-1的后缀的最长公共前缀,也就是sa[i]和sa[i-1]的最长公共前缀 h[i]:以第i个字符为起点的后缀与排名在它前1名的后缀的最长 ...
- bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
先求后缀数组.相邻两个后缀的最长公共前缀 二分答案,o(n)check 1 #include<algorithm> 2 #include<iostream> 3 #includ ...
- 【USACO06DEC】—牛奶模式Milk Patterns(后缀自动机)
传送门 后缀自动机板子题了吧 只需要求Parent−TreeParent-TreeParent−Tree上非叶子节点的最长的lenlenlen就可以了 因为字符集太大又不想离散化 就直接用mapmap ...
- POJ - 3261 Milk Patterns(二分+后缀数组)
题目链接:点击查看 题目大意:给出一个字符串,以及一个k,现在求出现次数大于等于k次的最大可重叠子串的长度 题目分析:可以说是后缀数组的模板题目了吧..直接跑出height数组,因为height数组代 ...
- poj 3261 Milk Patterns 后缀数组 最长重复子串
http://poj.org/problem?id=3261 给一串数组,数组最少含有k个相同子串,可重叠,求这样子串的最长长度. 后缀数组求出 height[],若连续k个height[]都大于mi ...
最新文章
- 长波通信、中波通信、短波通信、超短波通信与微波通信介绍
- 常用的相似性度量(距离总结)
- librtmp协议分析---RTMP_SendPacket函数
- php导出页面居中设置,PHPExcel导出插入图片和居中问题
- dbm和mysql使用场景_mysql基本用法总结
- php(2)—基础补充
- 如何抓取Camera systrace
- 华为服务器u盘装linux_华为matebook14双系统(deepin15.11+win10)新体验!
- 【转载】Gradle命令行黑魔法
- 关于账号密码校验的两种IO流操作
- 01-artDialog4.1.7常用整理
- 用文本挖掘剖析近5万首《全唐诗》
- python像数常用函数_八卦象数疗法常见配方
- dalao自动报表邮件2.0
- python 实现问卷星自动填写多份
- layui使用初步入门
- 分享一个:批量下载个性化桌面壁纸和各种唯美图片的方法
- 循环结构习题:公式求π值
- 企业邮箱登录入口,邮箱登陆登录入口有哪些?
- 7-36 大炮打蚊子(15 分)