【POJ】3294 Life Forms
2012-07-11 10:39
197 查看
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 1100 #define MAXL 200100 char str[MAXN][MAXN],s[MAXL]; int wa[MAXL],wb[MAXL],wv[MAXL],ws[MAXL]; int sa[MAXL],height[MAXL],rk[MAXL]; int m,len[MAXN]; inline bool cmp(int *r,int a,int b,int L) { return r[a]==r[b]&&r[a+L]==r[b+L]; } void 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]=s[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=p=1;p<n;j<<=1,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<m;i++) ws[i]=0; for(i=0;i<n;i++) ws[wv[i]=x[y[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,x[sa[0]]=0,p=i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } } void Height(int n) { int i,j,k; for(i=1;i<=n;i++) rk[sa[i]]=i; for(i=k=0;i<n;height[rk[i++]]=k) for(k?k--:0,j=sa[rk[i]-1];s[i+k]==s[j+k];k++); } bool OK(int n,int mid) { int i,j,k,t,cnt; bool h[MAXN]; for(i=1;i<=n;i++) { if(height[i]>=mid) { memset(h,false,sizeof(h)); for(j=i;j<=n&&height[j]>=mid;j++); for(k=i-1;k<j;k++) { t=upper_bound(len,len+m,sa[k])-len; h[t]=true; } for(k=cnt=0;k<m;k++) { if(h[k]) cnt++; } if(cnt>(m>>1)) return true; i=j-1; } } return false; } void Print(int n,int low) { int i,j,k,t,cnt; bool h[MAXN]; for(i=1;i<=n;i++) { if(height[i]>=low) { memset(h,false,sizeof(h)); for(j=i;j<=n&&height[j]>=low;j++); for(k=i-1;k<j;k++) { t=upper_bound(len,len+m,sa[k])-len; h[t]=true; } for(k=cnt=0;k<m;k++) { if(h[k]) cnt++; } if(cnt>(m>>1)) { for(k=sa[i];k<sa[i]+low;k++) putchar(s[k]); putchar('\n'); } i=j-1; } } } int main() { int n,i,j,high,low,mid; bool first=true; while(scanf("%d",&m),m) { if(first) first=false; else putchar('\n'); high=0; for(i=s[0]=0;i<m;i++) { scanf(" %s",str[i]); n=strlen(str[i]); if(i+1>='a') str[i] ='a'-1; else str[i] =i+1; str[i][n+1]=0; high=max(high,n); strcat(s,str[i]); len[i]=strlen(s); } n=len[m-1]-1; s =0; SA(n+1,256); Height(n); for(low=0,high++;low<high;) { mid=(low+high)>>1; if(OK(n,mid)) low=mid+1; else high=mid; } low=max(low-1,0); if(low) Print(n,low); else puts("?"); } return 0; }
相关文章推荐
- poj 3294 Life Forms(后缀数组+二分)
- POJ 3294 Life Forms(后缀数组)
- POJ-3294-Life Forms(后缀数组-不小于 k 个字符串中的最长子串)
- poj 3294 Life Forms
- POJ - 3294 Life Forms
- POJ 3294 Life Forms
- POJ 3294 Life Forms(不小于k个字符串中的最长子串 后缀数组)
- poj3294 Life Forms(后缀数组)
- POJ 3294 Life Forms 后缀数组+二分 求至少k个字符串中包含的最长子串
- POJ 3294 Life Forms(后缀数组)
- poj 3294 Life Forms (后缀数组应用)
- poj 3294 Life Forms
- POJ-3294 Life Forms 后缀数组
- poj 3294(Life Forms) 2分+ 后缀数组
- POJ 3294 Life Forms
- POJ 3294 Life Forms
- POJ 3294 Life Forms
- POJ 3294 Life Forms (后缀数组,求出现在不少于k个字符串的最长子串)
- POJ 3294 Life Forms 二分 + 哈希
- POJ3294——Life Forms 后缀数组