poj_3261_Milk Patterns(后缀数组)
2016-08-13 01:40
316 查看
题意:
给你一串数,让你找重复出现不少于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+7; int rnk ,sa ,height ,c ,s ; void getsa(int n,int m,int *x=rnk,int *y=height){ FN(m)c[i]=0;FN(n)c[x[i]=s[i]]++;FN(m)c[i+1]+=c[i]; for(int i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(int k=1,p;p=0,k<=n;k=p>=n?N:k<<1,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]=0;FN(n)c[x[y[i]]]++;FN(m)c[i+1]+=c[i]; for(int i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y),p=1,x[sa[0]]=0; for(int i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; } FN(n)rnk[sa[i]]=i; for(int i=0,j,k=0;i<n-1;height[rnk[i++]]=k) for(k=k?k-1:k,j=sa[rnk[i]-1];s[i+k]==s[j+k];k++); } } using namespace suffixarray; int n,k,a ,ed; inline int getid(int x){return lower_bound(a+1,a+1+ed,x)-a;} bool check(int x,int cnt=1) { F(i,2,n)if(height[i]>=x){if(++cnt>=k)return 1;}else cnt=1; return 0; } int main() { while(~scanf("%d%d",&n,&k)) { F(i,1,n)scanf("%d",a+i),s[i-1]=a[i]; sort(a+1,a+1+n),ed=1; F(i,2,n)if(a[i]!=a[ed])a[++ed]=a[i]; F(i,0,n-1)s[i]=getid(s[i]); s =0,getsa(n+1,ed+1); int l=1,r=n,mid,ans=0; while(l<=r)mid=(l+r)>>1,check(mid)?l=(ans=mid)+1:r=mid-1; printf("%d\n",ans); } return 0; }View Code
相关文章推荐
- POJ-3261-Milk Patterns(后缀数组)
- [后缀数组+离散化+二分] poj 3261 Milk Patterns
- POJ 3261 Milk Patterns 最长出现k次的子串长度(后缀数组)
- 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 (后缀数组)