BZOJ1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
2014-08-29 10:04
465 查看
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 491 Solved: 274
[Submit][Status]
Description
农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次。当K=2时,这个长度为4。Input
* Line 1: 两个整数 N,K。* Lines 2..N+1: 每行一个整数表示当天的质量值。
Output
* Line 1: 一个整数:N天中最长的出现了至少K次的模式的长度Sample Input
8 21
2
3
2
3
2
3
1
Sample Output
4HINT
Source
Gold题解
可重叠的k次最长重复子串
分组+二分+判定
代码:
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define inf 1000000000 #define maxn 20000+1000 #define maxm 1000000+100 #define eps 1e-10 #define ll long long #define pa pair<int,int> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} return x*f; } int wa[maxn],wb[maxn],wr[maxm],a[maxn],sa[maxn],rank[maxn],h[maxn],n,k; inline bool cmp(int *r,int a,int b,int l) { return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(int *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++)wr[i]=0; for(i=0;i<n;i++)wr[x[i]=r[i]]++; for(i=1;i<m;i++)wr[i]+=wr[i-1]; for(i=n-1;i>=0;i--)sa[--wr[x[i]]]=i; for(j=1,p=1;p<n;j<<=1,m=p) { for(p=0,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++)wr[i]=0; for(i=0;i<n;i++)wr[x[y[i]]]++; for(i=1;i<m;i++)wr[i]+=wr[i-1]; for(i=n-1;i>=0;i--)sa[--wr[x[y[i]]]]=y[i]; for(t=x,x=y,y=t,p=1,i=1,x[sa[0]]=0;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } } void geth(int *r,int *sa,int n) { int i,j,k=0; for(i=1;i<=n;i++)rank[sa[i]]=i; for(i=0;i<n;h[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); } bool check(int x) { int cnt=1; for(int i=1;i<=n;i++) if(h[i]>=x) { cnt++; if(cnt>=k)return 1; } else cnt=1; return 0; } int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();k=read(); for(int i=0;i<n;i++)a[i]=read()+1; a =0; da(a,sa,n+1,1000002); geth(a,sa,n); int l=1,r=n,mid; while(l<=r) { mid=(l+r)>>1; if(check(mid))l=mid+1;else r=mid-1; } printf("%d\n",r); return 0; }
View Code
相关文章推荐
- 后缀数组2.0--Height数组(bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式)
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
- bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
- 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式
- [BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- 【BZOJ】1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
- 【BZOJ】【1717】【USACO 2006 Dec】Milk Patterns产奶的模式
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
- 【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
- bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式[后缀数组]题解②
- [Usaco2006 Dec][BZOJ1717] Milk Patterns 产奶的模式|后缀数组
- 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组
- bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
- bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式
- 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组+离散化
- BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 二分答案 哈希/后缀数组
- bzoj 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式