记录编号 183994 评测结果 AAAAAAAAAA
题目名称 [POJ2774]很长的信息 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 1.096 s
提交时间 2015-09-02 08:13:39 内存使用 4.61 MiB
显示代码纯文本
#define MAXN 200010UL

#include <cstdio>
#include <cstring>

char str[MAXN];

int Ans,n,lena,lenb,num[MAXN],temp_a[MAXN],temp_b[MAXN],wv[MAXN],wd[MAXN],sa[MAXN],rank[MAXN],height[MAXN];

inline bool cmp(int *r,int a,int b,int l){
	return r[a]==r[b]&&r[a+l]==r[b+l];
}

inline void GetSA(int *r,int n,int m){
	int i,j,p,*x=temp_a,*y=temp_b,*t;
	for(i=0;i<m;i++) wd[i]=0;
	for(i=0;i<n;i++) wd[x[i]=r[i]]++;
	for(i=1;i<m;i++) wd[i]+=wd[i-1];
	for(i=n-1;i>=0;i--) sa[--wd[r[i]]]=i;
	for(j=1,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<n;i++) wv[i]=x[y[i]];
		for(i=0;i<m;i++) wd[i]=0;
		for(i=0;i<n;i++) wd[wv[i]]++;
		for(i=1;i<m;i++) wd[i]+=wd[i-1];
		for(i=n-1;i>=0;i--) sa[--wd[wv[i]]]=y[i];
		for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
	}
	return;
}

inline void Cal_Height(int *r,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++);
	}
	return;
}

int main(){
	freopen("longlongmessage.in","r",stdin);
	freopen("longlongmessage.out","w",stdout);
	scanf("%s",str);int i,k=0;lena=strlen(str);
	for(i=0;i<lena;i++){
		num[k++]=str[i]-'a'+2;
	}num[k++]=1;
	scanf("%s",str);lenb=strlen(str);
	for(i=0;i<lenb;i++){
		num[k++]=str[i]-'a'+2;
	}n=lena+lenb;GetSA(num,k+1,30);Cal_Height(num,k);
	for(i=2;i<k;i++){
		if(((sa[i]<lena&&sa[i-1]>lena)||(sa[i]>lena&&sa[i-1]<lena))&&Ans<height[i]){
			Ans=height[i];
		}
	}
	printf("%d",Ans);
	return 0;
}