poj_3261_Milk Patterns(后缀数组)
题意:
给你一串数,让你找重复出现不少于k次的子串的最长长度,重复出现可重叠
题解:
老套路,还是二分答案,然后用height数组来check答案
#include<cstdio>
#include<algorithm>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; namespace suffixarray{
#define FN(n) for(int i=0;i<n;i++)
const int N =2E5+;
int rnk[N],sa[N],height[N],c[N],s[N];
void getsa(int n,int m,int *x=rnk,int *y=height){
FN(m)c[i]=;FN(n)c[x[i]=s[i]]++;FN(m)c[i+]+=c[i];
for(int i=n-;i>=;i--)sa[--c[x[i]]]=i;
for(int k=,p;p=,k<=n;k=p>=n?N:k<<,m=p){
for(int i=n-k;i<n;i++)y[p++]=i;
FN(n)if(sa[i]>=k)y[p++]=sa[i]-k;
FN(m)c[i]=;FN(n)c[x[y[i]]]++;FN(m)c[i+]+=c[i];
for(int i=n-;i>=;i--)sa[--c[x[y[i]]]]=y[i];
swap(x,y),p=,x[sa[]]=;
for(int i=;i<n;i++)
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+k]==y[sa[i]+k]?p-:p++;
}
FN(n)rnk[sa[i]]=i;
for(int i=,j,k=;i<n-;height[rnk[i++]]=k)
for(k=k?k-:k,j=sa[rnk[i]-];s[i+k]==s[j+k];k++);
}
}
using namespace suffixarray;
int n,k,a[N],ed; inline int getid(int x){return lower_bound(a+,a++ed,x)-a;} bool check(int x,int cnt=)
{
F(i,,n)if(height[i]>=x){if(++cnt>=k)return ;}else cnt=;
return ;
} int main()
{
while(~scanf("%d%d",&n,&k))
{
F(i,,n)scanf("%d",a+i),s[i-]=a[i];
sort(a+,a++n),ed=;
F(i,,n)if(a[i]!=a[ed])a[++ed]=a[i];
F(i,,n-)s[i]=getid(s[i]);
s[n]=,getsa(n+,ed+);
int l=,r=n,mid,ans=;
while(l<=r)mid=(l+r)>>,check(mid)?l=(ans=mid)+:r=mid-;
printf("%d\n",ans);
}
return ;
}
poj_3261_Milk Patterns(后缀数组)的更多相关文章
- [USACO06FEC]Milk Patterns --- 后缀数组
[USACO06FEC]Milk Patterns 题目描述: Farmer John has noticed that the quality of milk given by his cows v ...
- poj3261Milk Patterns 后缀数组
题目地址:http://poj.org/problem?id=3261 题目: Description Farmer John has noticed that the quality of milk ...
- POJ3261 Milks 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(后缀数组+二分答案)
Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...
- poj3261 Milk Patterns 后缀数组求可重叠的k次最长重复子串
题目链接:http://poj.org/problem?id=3261 思路: 后缀数组的很好的一道入门题目 先利用模板求出sa数组和height数组 然后二分答案(即对于可能出现的重复长度进行二分) ...
- BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ...
- POJ 3261 Milk Patterns(后缀数组+单调队列)
题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ...
- POJ 3261 Milk Patterns ( 后缀数组 && 出现k次最长可重叠子串长度 )
题意 : 给出一个长度为 N 的序列,再给出一个 K 要求求出出现了至少 K 次的最长可重叠子串的长度 分析 : 后缀数组套路题,思路是二分长度再对于每一个长度进行判断,判断过程就是对于 Height ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
随机推荐
- 某种数列问题 (一场欢乐赛的T2)
个人觉得挺难的一道DP题 不会 没有思路 于是去找的正解 于是.. #include <iostream> #include <cstring> #define Max 100 ...
- java list<string>集合 传递值给js的数组
转载地址:http://blog.sina.com.cn/s/blog_611f65fd0100msc6.html. 1.Action 中代码 List result = n ...
- 2016-2017 CT S03E02: Codeforces Trainings Season 3 Episode 2
A HHPaint B Square Root C Interesting Places D Road to Home E Ant and apples F Square G Pair H The F ...
- 今天学习的裸板驱动之GPIO实验学习心得
GPIO分成很多组今天学习的这个芯片的GPIO有GPA-GPJ个组.具体可在芯片手册中看到. GPIO有很多寄存器,今天学习的这个芯片,他的寄存器分为以下几种类型: (1)端口控制寄存器 (2)端口数 ...
- C#基础--属性
定义一个Book类: namespace ConsoleTest { public class Book { private string _bookIsbn; private string _boo ...
- 两种画线算法(DDA&Bersenham)
DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...
- Xsser
来源:https://www.cqhacker.cn/post-174.html XSSer使用说明 =============================================== ...
- java实现线性表
/** * 线性表 * @author zyyt * */ public class LinkList {//框架级别的大师级 private int size;//链表的实际大小 private ...
- Java中的Class类
Class 类是在Java语言中定义一个特定类的实现.一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类.Class类的对象用于表示当前运行的 Java 应用程序中的类和接口. ...
- mysql5.5修改字符编码
因为mysql版本问题,网上各种修改编码的方法都不行,最后找到下面这条,终于解决! [mysqld]下添加: character-set-server=utf8 collation-server=ut ...