题目链接:https://cn.vjudge.net/contest/320541#problem/D
翻译:
合并字符串,两串a,b,a的后缀和b的前缀最大匹配长度为d,b的后缀和a的前缀的最大匹配长度为e,哪个长度大,就消去相同部分,衔接,否则按字母顺序衔接。
分析:
kmp就是找原串中是否含有模拟串,随着字符的一个个往后挪,最后能得出模拟串的前缀和原串的后缀是否有相同的部分。用kmp能找到最大长度。
把两个字符串分别当成原串和模拟串,两次kmp找到最大的长度。
代码:
#include<cstdio>
#include<cstring>
#define N 1000001
char a[N],b[N];
int net[N];
void kmp(char *s,int x)
{
int i=0,j=-1;
net[0]=-1;
while(i<x)
{
if(j<0||s[i]==s[j])
net[++i]=++j;
else
j=net[j];
}
}
int solve(char *s1,char *s2)
{
int len1=strlen(s1),len2=strlen(s2);
kmp(s2,len2);
int i=0,k=0;
while(i<len1)
{
if(k<0||s1[i]==s2[k])
i++,k++;
else
k=net[k];
}
return k;
}
int main()
{
while(~scanf("%s%s",a,b))
{
int t1=solve(a,b);
int t2=solve(b,a);
if(t1>t2)
printf("%s%s\n",a,b+t1);
else if(t1<t2)
printf("%s%s\n",b,a+t2);
else
{
if(strcmp(a,b)>0)
printf("%s%s\n",b,a+t1);
else
printf("%s%s\n",a,b+t1);
}
}
return 0;
}