POJ3261 Milk Patterns(二分+后缀数组)
题目求最长的重复k次可重叠子串。
与POJ1743同理。
- 二分枚举ans判定是否成立
- height分组,如果大于等于ans的组里的个数大于等于k-1,这个ans就可行
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define MAXN 1000001
- int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
- int cmp(int *r,int a,int b,int l){
- return r[a]==r[b] && r[a+l]==r[b+l];
- }
- int sa[MAXN],rank[MAXN],height[MAXN];
- void SA(int *r,int n,int m){
- int *x=wa,*y=wb;
- for(int i=; i<m; ++i) ws[i]=;
- for(int i=; i<n; ++i) ++ws[x[i]=r[i]];
- for(int i=; i<m; ++i) ws[i]+=ws[i-];
- for(int i=n-; i>=; --i) sa[--ws[x[i]]]=i;
- int p=;
- for(int j=; p<n; j<<=,m=p){
- p=;
- for(int i=n-j; i<n; ++i) y[p++]=i;
- for(int i=; i<n; ++i) if(sa[i]>=j) y[p++]=sa[i]-j;
- for(int i=; i<n; ++i) wv[i]=x[y[i]];
- for(int i=; i<m; ++i) ws[i]=;
- for(int i=; i<n; ++i) ++ws[wv[i]];
- for(int i=; i<m; ++i) ws[i]+=ws[i-];
- for(int i=n-; i>=; --i) sa[--ws[wv[i]]]=y[i];
- swap(x,y); x[sa[]]=; p=;
- for(int i=; i<n; ++i) x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
- }
- for(int i=; i<n; ++i) rank[sa[i]]=i;
- int k=;
- for(int i=; i<n-; height[rank[i++]]=k){
- if(k) --k;
- for(int j=sa[rank[i]-]; r[i+k]==r[j+k]; ++k);
- }
- }
- int n,k,a[MAXN];
- bool isok(int len){
- int cnt=;
- bool flag=;
- for(int i=; i<=n; ++i){
- if(height[i]>=len){
- if(flag){
- ++cnt;
- if(cnt+>=k) return ;
- }else{
- flag=;
- cnt=;
- if(cnt+>=k) return ;
- }
- }else{
- flag=;
- cnt=;
- }
- }
- return ;
- }
- int main(){
- int mx=;
- scanf("%d%d",&n,&k);
- for(int i=; i<n; ++i){
- scanf("%d",a+i);
- mx=max(mx,++a[i]);
- }
- a[n]=;
- SA(a,n+,mx+);
- int l=,r=n;
- while(l<r){
- int mid=l+r+>>;
- if(isok(mid)) l=mid;
- else r=mid-;
- }
- printf("%d",l);
- return ;
- }
POJ3261 Milk Patterns(二分+后缀数组)的更多相关文章
- POJ3261 Milk Patterns 【后缀数组】
牛奶模式 时间限制: 5000MS 内存限制: 65536K 提交总数: 16796 接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...
- poj3261 Milk Patterns【后缀数组】【二分】
Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...
- POJ-3261 Milk Patterns(后缀数组)
题目大意:找出至少出现K次的子串的最长长度. 题目分析:二分枚举长度x,判断有没有最长公共前缀不小于x的并且连续出现了至少k次的有序子串区间. 代码如下: # include<iostream& ...
- poj3261 Milk Patterns(后缀数组)
[题目链接] http://poj.org/problem?id=3261 [题意] 至少出现k次的可重叠最长子串. [思路] 二分长度+划分height,然后判断是否存在一组的数目不小于k即可. 需 ...
- 【BZOJ1717&POJ3261】Milk Patterns(后缀数组,二分)
题意:求字符串的可重叠的k次最长重复子串 n<=20000 a[i]<=1000000 思路:后缀数组+二分答案x,根据height分组,每组之间的height>=x 因为可以重叠, ...
- POJ 3261 Milk Patterns(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=3261 [题目大意] 求最长可允许重叠的出现次数不小于k的子串. [题解] 对原串做一遍后缀数组,二分子串长度x,将前缀相同长度超过 ...
- POJ 3261 Milk Patterns(后缀数组+二分答案+离散化)
题意:给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠. 分析:经典的后缀数组求解题:先二分答案,然后将后缀分成若干组.这里要判断的是有没有一个组的符合要求的后缀个数(height ...
- poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7938 Accepted: 3598 Cas ...
- POJ 3261 Milk Patterns 【后缀数组 最长可重叠子串】
题目题目:http://poj.org/problem?id=3261 Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Subm ...
- POJ 3261 Milk Patterns (后缀数组,求可重叠的k次最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16742 Accepted: 7390 Ca ...
随机推荐
- jenkins shell脚本构建项目--留
1.echo `date` "doing compling . . . " if [ "$RELEASE" == "false" ]; ...
- FTP2
FTP: 环境:windows, python 3.5功能:1.用户加密认证,可自行配置家目录磁盘大小2.多用户登陆3.查看当前目录(家目录权限下)4.切换目录(家目录权限下)5.上传下载,进度条展示 ...
- 【转载】Unity3d UnityEditor编辑器定制和开发插件
在阅读本教程之前,你需要对Unity的操作流程有一些基础的认识,并且最好了解内置的GUI系统如何使用. 如何让编辑器运行你的代码 Unity3D可以通过事件触发来执行你的编辑器代码,但是我们需要一些编 ...
- java 日期处理相关
/** *获取指定日期 前后指定天数的 日期 * */ public static String getNewDate(String sdate, int days) throws Exception ...
- SpringBoot Rabbitmq接收消息
官网地址:https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#boot-features-amqp ...
- android 拓展ImageView播放GIF动画
原生Android控件ImageView并不能支持播放GiF格式的图片.如果将一张GIF的图片放入ImageView中,它只会显示图片的第一帧,不会产生任何动画效果. Android中播放GIF动画实 ...
- BATCH梯度下降,单变量线性回归
- 为啥shmem不回收 | drop_caches
内核在哪里禁止对tmpfs中内存页的回收 mem.limit_in_bytes同样会触发shrink_zones过程! shrink_zones是代码中的直接内存回收路径 1.try_to_free_ ...
- [hdu6437]Problem L. Videos
题目大意:有$n$个小时,有$m$个节目(每种节目都有类型$0/1$),有$k$个人,一个人连续看相同类型的节目会扣$w$快乐值. 每一种节目有都一个播放区间$[l,r]$.每个人同一时间只能看一个节 ...
- POJ 3461Oulipo KMP模板
KMP之所以线性,因为匹配的时候i是不往回走的 我们只用调整j的位置 假设在s中找t 用二元组(i,j)表示s串的[i-j+1,i] 与t串的[1,j]匹配 假设s[i+1]和t[j]匹配上了,就j+ ...