[后缀数组+二分] hdu 4080 Stammering Aliens
来源:互联网 发布:是故教然后知困 编辑:程序博客网 时间:2024/05/16 01:46
题意:最长重复出现至少k次的可重叠子串且输出最靠右的子串起始位置的下标。
注意
2
ababcece
输出的是
2 6
思路:同样的后缀数组加上二分长度,这里因为要求是要最右边的,所以在二分的时候可以存一下每次取最大的值就好了。
#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"#include"map"using namespace std;#define N 40350int wa[N],wb[N],wv[N],wws[N];int sa[N],ra[N],height[N];int v[N];char fuck[N];int cmp(int *r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l];}void da(int n,int m){ int i,j,p,*x=wa,*y=wb; for(i=0; i<m; i++) wws[i]=0; for(i=0; i<n; i++) wws[x[i]=v[i]]++; for(i=1; i<m; i++) wws[i]+=wws[i-1]; for(i=n-1; i>=0; i--) sa[--wws[x[i]]]=i; for(j=1,p=1; p<n; j*=2,m=p) { for(i=n-j,p=0; 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++) wws[i]=0; for(i=0; i<n; i++) wws[wv[i]]++; for(i=1; i<m; i++) wws[i]+=wws[i-1]; for(i=n-1; i>=0; i--) sa[--wws[wv[i]]]=y[i]; for(swap(x,y),p=1,i=1,x[sa[0]]=0; i<n; i++) x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++; } return ;}void gethei(int n){ int i,j,k=0; for(i=1; i<=n; i++) ra[sa[i]]=i; for(i=0; i<n; i++) { if(k) k--; j=sa[ra[i]-1]; while(v[i+k]==v[j+k]) k++; height[ra[i]]=k; } return ;}int ok(int x,int k,int n){ int i; int sum=1,ans=-1; int MAX=-1; for(i=1; i<=n; i++) { if(height[i]>=x) { MAX=max(max(sa[i],sa[i-1]),MAX); //每段中找到最大 sum++; if(sum>=k) ans=max(MAX,ans); //当满足k次的时候 更新ans保证最大 } else { MAX=-1; sum=1; } } return ans;}int main(){ int n; while(scanf("%d",&n),n) { scanf("%s",fuck); if(n==1) { printf("%d %d\n",strlen(fuck),0); continue; } int i; int len=strlen(fuck); for(i=0; fuck[i]; i++) v[i]=fuck[i]-'a'+2; v[len]=0; da(len+1,30); gethei(len); int l=1,r=len; int MAX=-1,ans=-1; while(l<=r) { int mid=(l+r)/2; int tep=ok(mid,n,len); if(tep!=-1) { MAX=tep; ans=mid; l=mid+1; } else r=mid-1; } if(ans==-1) puts("none"); else printf("%d %d\n",ans,MAX); } return 0;}
0 0
- [后缀数组+二分] hdu 4080 Stammering Aliens
- HDU 4080 Stammering Aliens (后缀数组 + 二分答案)
- HDU 4080 Stammering Aliens(后缀数组+二分)
- hdu 4080 Stammering Aliens - 后缀数组
- HDU 4080 Stammering Aliens(后缀数组)
- HDU 4080 Stammering Aliens && 后缀数组
- ZOJ3395 Stammering Aliens 二分+后缀数组
- hdu4080---Stammering Aliens(后缀数组+二分)
- UVA 12206 Stammering Aliens(后缀数组+二分)
- hdu 4080 Stammering Aliens 二分 hash
- UVALive 4513 Stammering Aliens (hash+二分 or 后缀数组)
- HDU 4080 Stammering Aliens
- Hdu 4080 & Poj 3882 Stammering Aliens (后缀数组 可重叠k次最长重复子串)
- [HDU 4080] Stammering Aliens (字符串哈希+二分)
- UVALive - 4513 Stammering Aliens(后缀数组模板)
- UVA 12206 - Stammering Aliens(后缀数组)
- UVALive4513 Stammering Aliens(哈希法,后缀数组)
- hdu 4080 Stammering Aliens ( 后缀数组 求最长的至少出现m次可重叠子串)
- hadoop2.2.0 centos 编译安装详解
- fatal error: malformed or corrupted AST file: 'Unable to load module Darwin.pcm 问题解决
- 2014年上半年服装业运行概况 整体效益平稳
- A008:vim 程式編輯器
- read by other session等待事件
- [后缀数组+二分] hdu 4080 Stammering Aliens
- win7远程工具mstsc.exe
- mvc部署1
- Cocos2D-X 场景间切换效果
- 返利商城返现情况
- java学习资源
- 基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)
- 费用流&网络流模版
- mvc部署2