POJ 3080 Blue Jeans (后缀数组)
来源:互联网 发布:金蝶实体数据库丢失 编辑:程序博客网 时间:2024/06/05 03:40
题目大意:
求出这些DNA序列中的最长且字典序最小的公共子串。
思路分析:
二分长度的答案,去height中扫描这个长度是否满足,一旦满足就马上输出,这样就可以保证字典序最小了。
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define maxn 1005using namespace std;char str[maxn];int sa[maxn],t1[maxn],t2[maxn],c[maxn],n;void suffix(int m){ int *x=t1,*y=t2; for(int i=0;i<m;i++)c[i]=0; for(int i=0;i<n;i++)c[x[i]=str[i]]++; for(int i=1;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i<n;i++)y[p++]=i; for(int i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(int i=0;i<m;i++)c[i]=0; for(int i=0;i<n;i++)c[x[y[i]]]++; for(int i=0;i<m;i++)c[i]+=c[i-1]; 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++; if(p>=n)break; m=p; }}int rank[maxn],height[maxn];void getheight(){ int k=0; for(int i=0;i<n;i++)rank[sa[i]]=i; for(int i=0;i<n;i++) { if(k)k--; if(!rank[i])continue; int j=sa[rank[i]-1]; while(str[i+k]==str[j+k])k++; height[rank[i]]=k; }}int pos,N,fans;bool vis[20];int bel[maxn];bool ok(){ for(int i=1;i<=N;i++) if(!vis[i])return false; return true;}bool check(int len){ pos=-1; memset(vis,false,sizeof vis); int i; for(i=1;i<n;i++) { if( height[i]<len ) { if(ok()) { pos=sa[i-1]; return true; } memset(vis,false,sizeof vis); } else { if(!vis[bel[sa[i-1]]])vis[bel[sa[i-1]]]=true; if(!vis[bel[sa[i]]])vis[bel[sa[i]]]=true; if(ok()) { pos=sa[i]; return true; } } } if(ok())pos=sa[i-1]; return pos!=-1;}char tmp[100];int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d",&N); int top=0; for(int i=1;i<=N;i++) { scanf("%s",tmp); for(int j=0;j<60;j++) { bel[top]=i; str[top++]=tmp[j]; } bel[top]=i; str[top++]=127-i; } str[top-1]=0; n=top; suffix(128); getheight(); int l=3,r=60,mid,ans=0; while(l<=r) { mid=(l+r)>>1; if(check(mid))ans=mid,fans=pos,l=mid+1; else r=mid-1; } if(ans<3)printf("no significant commonalities"); else { for(int i=fans;i<fans+ans;i++)printf("%c",str[i]); } puts(""); } return 0;}
1 0
- POJ 3080 Blue Jeans (后缀数组)
- POJ 3080 Blue Jeans 后缀数组
- POJ3080:Blue Jeans(后缀数组)
- poj 3080 Blue Jeans
- poj 3080 Blue Jeans
- poj 3080 Blue Jeans
- poj 3080 Blue Jeans
- poj 3080 Blue Jeans
- POJ 3080 Blue Jeans
- POJ 3080 Blue Jeans
- POJ 3080 Blue Jeans
- POJ 3080 Blue Jeans
- Poj 3080 Blue Jeans
- POJ 3080 Blue Jeans
- POJ 3080 Blue Jeans
- POJ 3080 Blue Jeans
- poj 3080 Blue Jeans
- poj 3080 Blue jeans
- 邻接表 几篇不错的讲解
- VS2010
- poj 1032 Parliament
- POJ-1659【 Frogs' Neighborhood】
- OpenGL: 错误总结
- POJ 3080 Blue Jeans (后缀数组)
- request.getParameter获取中文是乱码
- [Linux]在终端启动程序关闭终端不退出的方法
- linux基础 辨别 shell脚本 shell VI
- 滤除批量Make输出结果中的warning
- 解决远程登陆Linux误按ctrl+s锁屏
- 成电先锋
- 如何一步一步删除(Linux & UNIX)环境下 Oracle 11g 集群节点
- C#.net winform skin 皮肤大全