【POJ1743】不可重叠最长重复子串
2015-12-15 17:02
225 查看
题意:求一个字符串里两个不重叠的最长重复子串
poj1743
2015-12-15 17:09:09
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; int sa[20010],rank[20010],y[20010],Rsort[20010]; int wr[20010],a[20010],height[20010],n; bool cmp(int k1,int k2,int ln){return wr[k1]==wr[k2] && wr[k1+ln]==wr[k2+ln];} void get_sa(int m) { int i,k,p,ln; memcpy(rank,a,sizeof(rank)); memset(Rsort,0,sizeof(Rsort)); for (i=1;i<=n;i++) Rsort[rank[i]]++; for (i=1;i<=m;i++) Rsort[i]+=Rsort[i-1]; for (i=n;i>=1;i--) sa[Rsort[rank[i]]--]=i; ln=1; p=0; while (p<n) { for (k=0,i=n-ln+1;i<=n;i++) y[++k]=i; for (i=1;i<=n;i++) if (sa[i]>ln) y[++k]=sa[i]-ln; for (i=1;i<=n;i++) wr[i]=rank[y[i]]; memset(Rsort,0,sizeof(Rsort)); for (i=1;i<=n;i++) Rsort[wr[i]]++; for (i=1;i<=m;i++) Rsort[i]+=Rsort[i-1]; for (i=n;i>=1;i--) sa[Rsort[wr[i]]--]=y[i]; memcpy(wr,rank,sizeof(wr)); p=1; rank[sa[1]]=1; for (i=2;i<=n;i++) { if (!cmp(sa[i],sa[i-1],ln)) p++; rank[sa[i]]=p; } m=p; ln*=2; } a[0]=sa[0]=0; } void get_he() { int i,j,k=0; for (i=1;i<=n;i++) { j=sa[rank[i]-1]; if (k) k--; while (a[j+k]==a[i+k]) k++; height[rank[i]]=k; } } bool check(int k) { int i,maxx=0,minn=20010; for(i=1;i<=n;i++) { if(height[i]<k) maxx=minn=sa[i]; else { if(sa[i]>maxx) maxx=sa[i]; if(sa[i]<minn) minn=sa[i]; if(maxx-minn>k) return 1; } } return 0; } int hd_work() { int l,r,mid,ans=0; l=1;r=n; while(l<=r) { mid=(l+r)/2; if(check(mid)) { l=mid+1; ans=mid; } else r=mid-1; } if(ans>=4) ans++; else ans=0; return ans; } int main() { int i,a1,a2; while(1) { scanf("%d",&n); if(n==0) break; scanf("%d",&a1); for(i=2;i<=n;i++) { scanf("%d",&a2); a[i-1]=a2-a1+88; a1=a2; } n--; get_sa(20010); get_he(); printf("%d\n",hd_work()); } }
poj1743
2015-12-15 17:09:09
相关文章推荐
- iOS 9 适配,我咋还没遇到这么多坑呢呀
- Quartz介绍 使用说明
- linux下的定时器
- 带动画的欢迎界面的实现
- uboot使用udp
- HTTP消息头网页缓存控制以及header常用指令
- spring解决后台json返回乱码问题
- 关于项目不同角度的一些看法
- 20条Linux命令面试问答
- 第六章 模块
- 深入理解Java内存模型(四)——volatile
- iScroll-js—“smooth scrolling for the web”
- [js开源组件开发]localStorage-cache本地存储的缓存管理
- PostgreSQL学习笔记10之性能提升技巧
- 线性表的顺序表示和实现
- Android 一个改善的okHttp封装库
- Multi-armed Bandit Experiments
- 乘船问题(贪心)
- 大数据平台安装测试(3)mesos安装配置(转载)
- LSM树存储模型