Codeforces-25E Test
题目大意:给定三个子串 求公共母串的最小长度
解题思路:运用kmp的next数组进行拼接,注意一共有6种组合方式
代码块:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
char str[3][100009] = {'\0'};
char strT[200009] = {'\0'};
int _next[300009] = { 0 };
int KMP(char s1[], char s2[]){
int n = strlen(s1);
int m = strlen(s2);
int j = -1;
_next[0] = -1;
for(int i = 1; i < m; i++)
{
while(j >= 0 && s2[i] != s2[j + 1]) j = _next[j];
if(s2[i] == s2[j + 1]) j++;
_next[i] = j;
}
j = -1;
for(int i = 0; i < n; i++)
{
if(j == m - 1) return 0;
while(j >= 0 && s1[i] != s2[j + 1]) j = _next[j];
if(s1[i] == s2[j + 1]) j++;
}
return m - 1 - j;
}
int com(char strA[], char strB[], char strC[]){
int res;
res = KMP(strA, strB);
strT[0] = '\0';
strcat(strT, strA);
strcat(strT, strB + strlen(strB) - res);
res = KMP(strT, strC);
return res + strlen(strT);
}
int main() {
scanf("%s %s %s", str[0], str[1], str[2]);
int res = 99999999;
res = min(res, com(str[0], str[1], str[2]));
res = min(res, com(str[0], str[2], str[1]));
res = min(res, com(str[1], str[0], str[2]));
res = min(res, com(str[1], str[2], str[0]));
res = min(res, com(str[2], str[1], str[0]));
res = min(res, com(str[2], str[0], str[1]));
cout << res;
return 0;
}