" abcxxxxabcx" 是第一个字符串的前缀和第二个字符串的后缀。
1. 题目大意:给你两个字符串,问你第一个字符串的前缀和第二个的字符串的额后缀相等得长度与第一个字符串的额后缀和第二个的字符串的前缀相等的长度,哪个大,输出其长度。
2. 解题思路:建立两个字符串,第一个是把第一个字符串放在前面,第二个放后面。第二个反之。然后分别跑一边建立kmp前缀数组,把最后数组的最后一个存下来,比较两次哪个大。
# include <stdio.h> # include <string.h> # include <math.h> # include <algorithm> # define N 11000 using namespace std; char str1[N], str2[N], str3[N], str4[N]; int prefix[N]; void setprefix(char pattern[]) { int i, j, len; len = strlen(pattern); prefix[0]=0; for(i=1; i<len; i++) { j=prefix[i-1]; while(pattern[i]!=pattern[j]&&j!=0) j=prefix[j-1]; if(pattern[i]==pattern[j]) prefix[i]=j+1; else prefix[i]=0; } } int main() { int Max1, Max2, len; while(~scanf("%s%s", str1, str2)) { memset(prefix,0,sizeof(prefix)); sprintf(str3,"%s%s\0", str1,str2); sprintf(str4, "%s%s\0", str2, str1); len = strlen(str3); setprefix(str3); Max1=prefix[len-1]; memset(prefix,0,sizeof(prefix)); setprefix(str4); Max2=prefix[len-1]; printf("%d\n", max(Max1, Max2)); } }