Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
n==1输出什么?原串吗?网上ac的程序不同串输出不同结果!晕!#include<iostream> #include<string> #include<algorithm> #include<stdio.h> #include<memory> #include<vector> using namespace std; #define MAXN 500000 #define INF 2100000000 int sa[MAXN],rank[MAXN],lrank[MAXN],height[MAXN]; void SuffixArray(); void GetLCP(); bool judge(int); int T,n,belong[MAXN]; char s[MAXN]; void chkmin(int& a,int b){if(a>b)a=b;} vector<int> V; int main(){ while(scanf("%d",&T),T){ n=0; gets(s); int mx=INF,i,j; for(i=0;i<T;++i){ gets(s+n); for(j=n;s[j];++j)belong[j]=i; chkmin(mx,j-n); s[n=j]='z'+1+i; belong[n++]=i; } SuffixArray(); GetLCP(); int l=0,r=mx,mid; while(l<r){ mid=(l+r+1)/2; if(judge(mid))l=mid; else r=mid-1; } judge(l); if(l==0)puts("?"); else{ for(i=0;i<V.size();++i){ for(j=0;j<l;++j)putchar(s[V[i]+j]);putchar(10); } } putchar(10); } return 0; } bool vis[1010]; bool judge(int X){ memset(vis,0,sizeof(bool)*T); int cont=0; V.clear(); for(int i=0;i<n;++i){ if(height[i]<X){ if(cont>0){ if(cont>T/2){ V.push_back(sa[i]); } memset(vis,0,sizeof(bool)*T); cont=0; } }else{ if(!vis[belong[sa[i]]])vis[belong[sa[i]]]=true,++cont; if(!vis[belong[sa[i+1]]])vis[belong[sa[i+1]]]=true,++cont; } } return V.size(); } bool _SA1(int a,int b){ return s[a]<s[b]||s[a]==s[b]&&a<b; } int K; bool _SA2(int a,int b){ return rank[a]<rank[b]||rank[a]==rank[b]&&rank[a+K]<rank[b+K]; } void SuffixArray(){ int i; for(i=0;i<n;++i)sa[i]=i; sort(sa,sa+n,_SA1); for(rank[sa[0]]=0,i=1;i<n;++i){ rank[sa[i]]=rank[sa[i-1]]; if(s[sa[i]]!=s[sa[i-1]])++rank[sa[i]]; } for(K=1;K<n&&rank[n-1]<n-1;K<<=1){ sort(sa,sa+n,_SA2); for(i=0;i<n;++i)lrank[i]=rank[i]; for(rank[sa[0]]=0,i=1;i<n;++i){ rank[sa[i]]=rank[sa[i-1]]; if(lrank[sa[i]]!=lrank[sa[i-1]]||lrank[sa[i]+K]!=lrank[sa[i-1]+K])rank[sa[i]]++; } } } void GetLCP(){ int i,j,dt; for(i=dt=0;i<n;++i){ if(rank[i]==n-1)height[rank[i]]=dt=0; else{ if(dt>0)--dt; for(j=sa[rank[i]+1];s[i+dt]==s[j+dt];++dt); height[rank[i]]=dt; } } } /* aaaaa ->aaaa asd -> ? asddasd -> asd */ 这样的结果也ac? Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator