//这题很值得记录,很有收藏价值,我都是看别人的代码会的。以后再回来看看。
AC代码:
#include<stdio.h>
#include<string.h>
#define max 10000005
char s[max];
char t[max];
char a[max];
int next[max];
int len1;
int len2;
int pre[max];
void get_next()
{
int i=0;
int j=-1;
next[0]=-1;
while(i<len1)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int main()
{
while(scanf("%s%s",t,s)!=EOF)
{
memset(next,0,sizeof(next));
len1=strlen(t);
len2=strlen(s);
get_next();
int i,j=0,k=0;
for(i=0;i<len2;i++,k++)
{
a[k]=s[i];
while(j>0&&s[i]!=t[j])
{
j=next[j];
}
if(s[i]==t[j])
{
j++;
}
if(j==len1)
{
k-=len1;
j=pre[k];
}
a[k+1]=0;
pre[k]=j;
}
printf("%s\n",a);
}
return 0;
}