//利用KMP求解,找两个字符串的前缀或者后缀相同的部分,不能是中间部分;la = KMP(str1,str2);lb = KMP(str2,str1);如果la > lb 说明找到模式串str2的//前缀与主串str1的后缀相同的部分,长度为la,公共部分是谁的后缀就先输出谁,此处时显然的;
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 100010;
int next[MAX];
char str1[MAX],str2[MAX];
void Get_NextVal(char *s)
{
int i = 0;
int j = -1;
next[0] = -1;
int Len = strlen(s);
while(i < Len)
{
if(j == -1 || s[i] == s[j])
{
++i,++j;
next[i] = j;
}
else
j = next[j];
}
}
int KMP(char *s1, char *s2)
{
int i = 0;
int j = 0;
int Len1 = strlen(s1);
int Len2 = strlen(s2);
Get_NextVal(s2);
while(i < Len1 && j < Len2)
{
if(j == -1 || s1[i] == s2[j])
{
++i;
++j;
}
else
j = next[j];
}
if(i >= Len1 )
return j;
return 0;
}
int main()
{
while(~scanf("%s%s",str1,str2))
{
int la = KMP(str1, str2);
int lb = KMP(str2, str1);
if(la == lb)
if(strcmp(str1,str2) < 0)
cout<<str1<<str2+la<<endl;
else
cout<<str2<<str1+lb<<endl;
else if(la < lb)
cout<<str2<<str1+lb<<endl;
else
cout<<str1<<str2+la<<endl;
}
return 0;
}