传送门:点我
Sample Input
asdf sdfg asdf ghjk
Sample Output
asdfg asdfghjk
注意:题目要求的是最短的字符串能包含所给的两个字符串,这里的包含一定是前一部分或后一部分包含,不能中间包含
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#define N 100005
using namespace std;
int Next[N];
char ss1[N],ss2[N];
int kmp(char s1[],char s2[])//s2加在s1上
{
int i,j;
int len2=strlen(s2);
for(i=1,j=0; i<len2; i++)
{
while(j>0&&s2[i]!=s2[j])
j=Next[j-1];
if(s2[i]==s2[j])
j++;
Next[i]=j;
}
int len=strlen(s1);
for(j=0,i=0; i<len; i++)
{
while(j>0&&s1[i]!=s2[j])
j=Next[j-1];
if(s1[i]==s2[j])
j++;
if(j==len2)
break;
}
if((j==len2&&i==len-1)||i==len)//s1和s2一块结束和s1结束s2未结束的情况就返回j
return j;
return 0;//此情况是s2在s1中间
}
int main()
{
char s1[N],s2[N];
int i;
while(~scanf("%s",s1))
{
scanf("%s",s2);
int len1=strlen(s1);
int len2=strlen(s2);
int k1=kmp(s1,s2);
int k2=kmp(s2,s1);
if(k1>k2||(k1==k2)&&strcmp(s1,s2)<0)//k1,k2其实就是重叠的部分
{
printf("%s",s1);
for(i=k1; i<len2; i++)
printf("%c",s2[i]);
}
else
{
printf("%s",s2);
for(i=k2; i<len1; i++)
printf("%c",s1[i]);
}
cout<<endl;
}
return 0;
}