The shortest common superstring of 2 strings S 1 and S 2 is a string S with the minimum number of characters which contains both S 1 and S 2 as a sequence of consecutive characters. For instance, the shortest common superstring of “alba” and “bacau” is “albacau”.
Given two strings composed of lowercase English characters, find the length of their shortest common superstring.
Given two strings composed of lowercase English characters, find the length of their shortest common superstring.
2
alba
bacau
resita
mures
7
8
题意:
问两个串结合后最短长度是多少。(next数组的应用)
可以第一个串前面的另一个串后面结合,也能中间和另一个串相同。结合的部分必须连续。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char a[1000005],b[1000005];
int nex[1000005];
int n,m,ans;
void get_next(char a[],char b[]){//第二个是子串
int i=0,j=-1;
nex[0]=-1;
int m=strlen(b);
while(i<m){
if(j==-1 || b[j]==b[i])nex[++i]=++j;
else j=nex[j];
}
}
int KMP(char a[],char b[]){//j是子串下标
get_next(a,b);
int i=0;
int j=0;
int n=strlen(a);
int m=strlen(b);
while(i<n){
if(j==-1 || a[i]==b[j]){
i++;j++;
}else j=nex[j];
if(j>=m)return j;
}
return j;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",a);
scanf("%s",b);
int n=strlen(a);
int m=strlen(b);
if(strcmp(a,b)==0){
printf("%d\n",m);
continue;
}
int x=KMP(a,b);
int y=KMP(b,a);
printf("%d\n",n+m-max(x,y));
}
return 0;
}