POJ 3261 Milk Patterns(后缀数组+二分答案)
【题目链接】 http://poj.org/problem?id=3261
【题目大意】
求最长可允许重叠的出现次数不小于k的子串。
【题解】
  对原串做一遍后缀数组,二分子串长度x,将前缀相同长度超过x的后缀分组,
      如果存在一个大小不小于k的分组,则说明答案可行,分治得到最大可行解就是答案。
【代码】
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=1000010,M=1000010;
int n,rank[N],sa[N],h[N],tmp[N],cnt[N],ans;int s[N];
void suffixarray(int n,int m){
int i,j,k;n++;
for(i=0;i<2*n+5;i++)rank[i]=sa[i]=h[i]=tmp[i]=0;
for(i=0;i<m;i++)cnt[i]=0;
for(i=0;i<n;i++)cnt[rank[i]=s[i]]++;
for(i=1;i<m;i++)cnt[i]+=cnt[i-1];
for(i=0;i<n;i++)sa[--cnt[rank[i]]]=i;
for(k=1;k<=n;k<<=1){
for(i=0;i<n;i++){
j=sa[i]-k;
if(j<0)j+=n;
tmp[cnt[rank[j]]++]=j;
}sa[tmp[cnt[0]=0]]=j=0;
for(i=1;i<n;i++){
if(rank[tmp[i]]!=rank[tmp[i-1]]||rank[tmp[i]+k]!=rank[tmp[i-1]+k])cnt[++j]=i;
sa[tmp[i]]=j;
}memcpy(rank,sa,n*sizeof(int));
memcpy(sa,tmp,n*sizeof(int));
if(j>=n-1)break;
}for(j=rank[h[i=k=0]=0];i<n-1;i++,k++)
while(~k&&s[i]!=s[sa[j-1]+k])h[j]=k--,j=rank[sa[j]+1];
}vector<int> v[N]; int k;
bool check(int x){
int cnt=-1;
for(int i=1;i<=n;i++){
if(h[i]<x)v[++cnt].clear();
v[cnt].push_back(i);
}for(int i=0;i<=cnt;i++)if(v[i].size()>=k)return 1;
return 0;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=0;i<n;i++)scanf("%d",&s[i]);
suffixarray(n,M);
int l=0,r=n,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}printf("%d\n",ans);
}return 0;
}
POJ 3261 Milk Patterns(后缀数组+二分答案)的更多相关文章
- Poj 3261 Milk Patterns(后缀数组+二分答案)
		Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ... 
- poj 3261 Milk Patterns 后缀数组 + 二分
		题目链接 题目描述 给定一个字符串,求至少出现 \(k\) 次的最长重复子串,这 \(k\) 个子串可以重叠. 思路 二分 子串长度,据其将 \(h\) 数组 分组,判断是否存在一组其大小 \(\ge ... 
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
		Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ... 
- POJ 3261 Milk Patterns(后缀数组+单调队列)
		题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ... 
- POJ 3261 Milk Patterns ( 后缀数组 && 出现k次最长可重叠子串长度 )
		题意 : 给出一个长度为 N 的序列,再给出一个 K 要求求出出现了至少 K 次的最长可重叠子串的长度 分析 : 后缀数组套路题,思路是二分长度再对于每一个长度进行判断,判断过程就是对于 Height ... 
- Poj 1743 Musical Theme(后缀数组+二分答案)
		Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ... 
- BZOJ 1717  [USACO06DEC] Milk Patterns (后缀数组+二分)
		题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ... 
- POJ 1226 Substrings(后缀数组+二分答案)
		[题目链接] http://poj.org/problem?id=1226 [题目大意] 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的. [题解] 我们将每个字符串倒置,用 ... 
- poj 3294 Life Forms - 后缀数组 - 二分答案
		题目传送门 传送门I 传送门II 题目大意 给定$n$个串,询问所有出现在严格大于$\frac{n}{2}$个串的最长串.不存在输出'?' 用奇怪的字符把它们连接起来.然后求sa,hei,二分答案,按 ... 
- POJ-3261 Milk Patterns,后缀数组+二分。。
		Milk Patterns 题意:求可重叠的至少重复出现k次的最长的字串长. 这题的做法和上一题 ... 
随机推荐
- 如何设置MySQL数据库名、表名大小写敏感
			在 MySQL 中,数据库和表其实就是数据目录下的目录和文. 因而,操作系统的敏感性决定数据库和表命名的大小写敏感.这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Un ... 
- Linux软连接与硬连接 .
			http://blog.csdn.net/ningxinghai/article/details/7342338 Linux的软连接相当于window系统的快捷方式,如我们桌面的QQ等. 硬连接相当于 ... 
- 测试通用的InsertOrUpdate
- 理解C语言声明的优先级规则
			声明从它的名字开始读取,然后依次按优先级依次读取. 优先级从高到低依次是 声明中被括号括起来的那部分 后缀操作符: 括号()表示这是一个函数 方括号表[]这是一个数组 前缀操作符:星号*表示“指向.. ... 
- equal_range用法
			equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置 ... 
- 三点顺序_nyoj_68(计算几何).java
			三点顺序 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的 ... 
- 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出
			7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ... 
- CodeForces - 61E Enemy is weak
			Description The Romans have attacked again. This time they are much more than the Persians but Shapu ... 
- android高仿微信拍照、多选、预览、删除(去除相片)相冊功能
			先声明授人与鱼不如授人与渔,仅仅能提供一个思路,当然须要源代码的同学能够私下有偿问我要源代码:QQ:508181017 工作了将近三年时间了,一直没正儿八经的研究系统自带的相冊和拍照,这回来个高仿微信 ... 
- Codeforces Round #262 (Div. 2) B
			题目: B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes inp ... 
