poj3261 后缀数组
2015-09-09 16:59
197 查看
可重叠的 k次最长重复子串。
给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。
二分答案,对于每个二分的mid值,height[i]>=mid且个数大于等于k个,就满足。
给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。
二分答案,对于每个二分的mid值,height[i]>=mid且个数大于等于k个,就满足。
#include<iostream> #include <string.h> #include<stdlib.h> #define LL long long using namespace std; #define maxn 2000010 int max(int x,int y) {return x>y?x:y;} int min(int x,int y) {return x<y?x:y;} int wa[maxn],wb[maxn],wv[maxn],WS[maxn]; int 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++) WS[i]=0; for(i=0;i<n;i++) WS[x[i]=r[i]]++; for(i=1;i<m;i++) WS[i]+=WS[i-1]; for(i=n-1;i>=0;i--) sa[--WS[x[i]]]=i; for(j=1,p=1;p<n;j*=2,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<n;i++) wv[i]=x[y[i]]; for(i=0;i<m;i++) WS[i]=0; for(i=0;i<n;i++) WS[wv[i]]++; for(i=1;i<m;i++) WS[i]+=WS[i-1]; for(i=n-1;i>=0;i--) sa[--WS[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } return; } int Rank[maxn],height[maxn]; void calheight(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;height[Rank[i++]]=k) for(k?k--:0,j=sa[Rank[i]-1];r[i+k]==r[j+k];k++); return; } int r[maxn],sa[maxn]; int ok(int x,int n,int k) { int i,j; int ret=1; for(i=1;i<=n;i++) { if(height[i]>=x) { ret++; } else { if(ret>=k) return 1; ret=1; } } if(ret>=k) return 1; return 0; } int main() { int n,k,i; while(cin>>n>>k) { memset(r,0,sizeof(r)); for(i=0;i<n;i++) cin>>r[i]; da(r,sa,n+1,1000000); calheight(r,sa,n); int left,right,mid; left=1; right=n; int ans=0; while(left<=right) { mid=(left+right)/2; if(ok(mid,n,k)) { ans=mid; left=mid+1; } else right=mid-1; } /*for(i=1;i<=n;i++) printf("%d ",height[i]); puts("");*/ cout<<ans<<endl; } }
相关文章推荐
- javaScript学习笔记(一)
- android下的回调机制 分享
- 从Jar包中读取资源文件
- 更改XP的MTU值
- WP开发 - 与iOS开发的一些区别
- eclipse大文件代码跳转
- iOS toll-free bridge
- Win8.1计算机管理打不开如何解决 Win8.1计算机管理打不开解决方法
- 给object数组进行排序(排序条件是每个元素对象的属性个数)
- 配置JAVA环境变量步骤
- Liferay 开发(一)
- jquery的ajax和getJson跨域获取json数据
- PostgreSQL:bytea字段读取结果错误
- JSP中的编码设置
- 记忆和转换原码、反码、补码和移码其实很简单!
- UVA1632_Alibaba
- 智能移动,启程
- 类目,延展的简单了解
- iOS 拨打电话的三种方式总结
- MSSQL将逗号分隔的字符串转换成列显示