Codeforces-25E Test

mac2024-08-17  65

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; }
最新回复(0)