记录编号 231297 评测结果 AAAAAAAAAA
题目名称 [POJ2774]很长的信息 最终得分 100
用户昵称 Gravatarhsez_jxr 是否通过 通过
代码语言 C++ 运行时间 0.283 s
提交时间 2016-02-26 08:02:48 内存使用 19.66 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#define N 100010
using namespace std;

int S,size,las;
int len[2*N],ch[2*N][26],par[2*N];
void add(int c)
{
	int p=las,np=las=++size;
	for(len[np]=len[p]+1;p&&!ch[p][c];p=par[p]) ch[p][c]=np;
	if(!p) return par[np]=S,void(0); int q=ch[p][c];
	if(len[q]==len[p]+1) return par[np]=q,void(0);
	int r=++size; len[r]=len[p]+1,par[r]=par[q],par[q]=par[np]=r;
	for(memcpy(ch[r],ch[q],sizeof(ch[q]));p&&ch[p][c]==q;p=par[p]) ch[p][c]=r;
}

char A[N],B[N];
int main()
{
	freopen("longlongmessage.in","r",stdin);
	freopen("longlongmessage.out","w",stdout);
	S=size=las=1;
	scanf("%s%s",A,B);
	int n=strlen(A);
	int m=strlen(B);
	for(int i=0;i<n;i++)
		add(A[i]-'a');
	int x=S,cur=0,ans=0;
	for(int i=0;i<m;i++)
	{
		int c=B[i]-'a';
		if(ch[x][c]) x=ch[x][c],cur++;
		else
		{
			while(x&&!ch[x][c]) x=par[x];
			if(x) cur=len[x]+1,x=ch[x][c];
			else x=S,cur=0;
		} if(ans<cur) ans=cur;
	}printf("%d\n",ans);
	return 0;
}