链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1841
题意:
两个字符串拼接,问拼成新串的最小长度,使得新串包含两个原串。
思路:
跑两遍kmp,找最长前缀。(先排除包含情况)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int next[maxn];
void getnext(char *b)
{
int len = strlen(b+1);
memset(next,0,sizeof next);
int j=0;
for(int i=2;i<=len;i++)
{
while(j&&b[j+1]!=b[i]) j=next[j];
if(b[j+1]==b[i]) j++;
next[i]=j;
}
}
int kmp(char *a,char *b)
{
int l1=strlen(a+1),l2=strlen(b+1);
getnext(b);
int j=0;
for(int i=1;i<=l1;i++)
{
while(j&&b[j+1]!=a[i])j=next[j];
if(b[j+1]==a[i])j++;
if(j==l2) return -1;
}
return j;
}
int main()
{
int t;
cin>>t;
while(t--)
{
char s1[maxn],s2[maxn];
scanf("%s%s",s1+1,s2+1);
int r=kmp(s1,s2);
int l=kmp(s2,s1);
if(r==-1||l==-1)
cout<<max(strlen(s1+1),strlen(s2+1))<<endl;
else
cout<<strlen(s1+1)+strlen(s2+1)-max(r,l)<<endl;
}
return 0;
}