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 |
为什么会OLE?谁能提供OLE数据?不胜感激!!! #include <stdio.h> #define LEN 200009 int T[LEN],sa[LEN],wa[LEN],wb[LEN],ws[LEN],wv[LEN]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} void suffixarray(int *r,int *sa,int n,int m){ int *x=wa,*y=wb,*t,i,j,p=1; for(i=0;i<m;i++) ws[i]=0; for(i=0;i<n;i++) ws[x[i]=r[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=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++) ws[i]=0; for(i=0;i<n;i++) ws[wv[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],sa[i-1],j)?p-1:p++; } } int rank[LEN],height[LEN]; void calheight(int *r,int *sa,int n){ int i,j,k=0; for(i=1;i<=n;i++) rank[sa[i]]=i; for(i=0;i<n;height[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); } int mm[LEN],best1[16][LEN],best2[16][LEN]; void initRMQ(int best[][LEN],int *RMQ,int n){ int i,j,a,b; for(mm[0]=-1,i=1;i<=n;i++) mm[i]=(i&(i-1))?mm[i-1]:mm[i-1]+1; for(i=1;i<=n;i++) best[0][i]=i; for(i=1;i<=mm[n];i++) for(j=1;j+(1<<i)-1<=n;j++){ a=best[i-1][j]; b=best[i-1][j+(1<<(i-1))]; best[i][j]=RMQ[a]<RMQ[b]?a:b; } } int askRMQ(int best[][LEN],int *RMQ,int a,int b){ int t=mm[b-a+1]; b-=(1<<t)-1; a=best[t][a]; b=best[t][b]; return RMQ[a]<RMQ[b]?a:b; } int lcp(int a,int b){ int t; a=rank[a];b=rank[b]; if(a>b) {t=a;a=b;b=t;} return height[askRMQ(best1,height,a+1,b)]; } int main(){ int Q=1,n,m,i,j,k,ans,p,q,r,s; char c; while((c=getchar())!='#'){ memset(rank,0,sizeof(rank)); for(T[0]=c-'a'+1,n=1;(c=getchar())!='\n';T[n++]=c-'a'+1); T[n]=27; for(i=1;i<=n;i++) T[n+i]=T[n-i]; T[m=2*n+1]=0; suffixarray(T,sa,m+1,28); calheight(T,sa,m); initRMQ(best1,height,m); for(i=1;i<=n;i++) wa[i]=rank[i-1]; initRMQ(best2,wa,n); ans=1,p=0,q=1; for(i=1;i<=n;i++) for(j=0;j+i<=n;j+=i){ k=i+lcp(j,j+i)+lcp(m-i-j,m-j); r=j-lcp(m-i-j,m-j); r=askRMQ(best2,wa,r+1,r+k%i+1)-1; if(ans<k/i||(ans==k/i&&rank[p]>rank[r])) ans=k/i,p=r,q=k/i*i; } printf("Case %d: ",Q++); for(i=0;i<q;i++) printf("%c",T[p+i]+'a'-1); puts(""); } system("pause"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator