POJ 3261 Milk Patterns(后缀数组+二分)
来源:互联网 发布:创新发展知乎 编辑:程序博客网 时间:2024/04/28 17:45
Description
给出一个字符串,求至少出现k次的可重叠的最长子串的长度
Input
第一行为两个整数n和k(1<=n<=20000,2<=k<=n),之后为n个介于1~1000000的整数表示该数字串
Output
输出一个整数表示在该串中至少出现k次的可重叠的最长子串的长度
Sample Input
8 2
1
2
3
2
3
2
3
1
Sample Output
4
Solution
后缀数组,二分最大长度,对于每个二分值,对height数组分组,如果存在一个组的数量大于等于k则符合条件,如果每组都不符合条件则这个k不符合条件
Code
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define maxn 22222int t1[maxn],t2[maxn],c[maxn],sa[maxn],rank[maxn],height[maxn];bool cmp(int *r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l];}void da(int str[],int n,int m){ n++; int i,j,p,*x=t1,*y=t2; for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[i]=str[i]]++; for(i=1;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(j=1;j<=n;j<<=1) { p=0; for(i=n-j;i<n;i++)y[p++]=i; for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j; for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[y[i]]]++; for(i=1;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; if(p>=n)break; m=p; } int k=0; n--; for(i=0;i<=n;i++)rank[sa[i]]=i; for(i=0;i<n;i++) { if(k)k--; j=sa[rank[i]-1]; while(str[i+k]==str[j+k])k++; height[rank[i]]=k; }}int n,k,a[maxn];int check(int mid){ int cnt=1; for(int i=2;i<=n;) { while(height[i]>=mid) cnt++,i++; if(cnt>=k)return 1; cnt=1,i++; } return 0;}int main(){ while(~scanf("%d%d",&n,&k)) { int temp=0; for(int i=0;i<n;i++)scanf("%d",&a[i]),temp=max(temp,a[i]); a[n]=0; da(a,n,temp+1); int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(check(mid))l=mid+1; else r=mid-1; } printf("%d\n",l-1); } return 0;}
0 0
- POJ 3261 Milk Patterns 后缀数组+二分
- poj 3261 Milk Patterns 后缀数组 二分
- 【poj 3261】Milk Patterns 二分+后缀数组
- poj 3261 Milk Patterns 后缀数组+二分
- POJ-3261 Milk Patterns,后缀数组+二分。。
- POJ 3261 Milk Patterns <后缀数组+二分>
- poj 3261 Milk Patterns(后缀数组,二分)
- |poj 3261|后缀数组|二分|Milk Patterns
- poj 3261 Milk Patterns (后缀数组+二分)
- POJ 3261 Milk Patterns 后缀数组+二分
- POJ 3261 Milk Patterns(二分+后缀数组)
- POJ 3261 Milk Patterns(后缀数组+二分)
- POJ 3261 Milk Patterns (后缀数组 + 二分)
- POJ 3261 Milk Patterns(二分+后缀数组)
- Milk Patterns(poj 3261,后缀数组)
- poj 3261 Milk Patterns(后缀数组)
- POJ 3261 Milk Patterns (后缀数组)
- poj 3261 Milk Patterns(后缀数组)
- Lily HBase Indexer在CDH中的基本使用
- C语言中的三种循环语句及其使用方法
- Spring Cacheable标签 内部调用失效问题
- [python]连接两个List
- Drawable资源——Inset Drawable 可绘制插图
- POJ 3261 Milk Patterns(后缀数组+二分)
- 初识H5开发混合APP
- mysql 慢查询
- c++ WlanAPI 承载网络 连接无线网络
- 心灵鸡汤之20160503
- activiti 并行网关(八)
- 运算放大器及其线性应用
- fatal error: hdf5.h: Aucun fichier ou dossier de ce type #include "hdf5.h"
- 1083. List Grades (25)