传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2594
【分析】求最长的str1的前缀同时满足是str2的后缀,把它们连在一起,从连接后从d=nex[len]开始找,直到长度小于等于str1或者str2的长度的最小值为止
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int M=50000+10;
char str1[M*2];
char str2[M];
int nex[M*2];
int len;
void getnex()
{
nex[0]=-1;
int i=0,j=1;
while(j<len)
{
if(i==-1 || str1[i]==str1[j])
{
i++;
j++;
nex[j]=i;
}
else
i=nex[i];
}
}
int main()
{
while(scanf("%s%s",str1,str2)!=EOF)
{
int l1=strlen(str1);
int l2=strlen(str2);
strcat(str1,str2);
len=strlen(str1);
getnex();
int d=nex[len];
while(d>l1 || d>l2) //直到长度小等于短串的长度
d=nex[d];
if(d==0)
printf("0\n");
else
{
str1[d]=0;
printf("%s %d\n",str1,d);
}
}
return 0;
}