牛客 Barn Echoes(扩展KMP) 发表于 2019-10-26 | 阅读次数: 题目链接题意给出两个字符串,求一个字符串的前缀与另一个字符串的后缀最长重叠长度 分析采用扩展KMP可以轻松解决此题 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <iostream>#include <algorithm>#include <string.h>#include <stdio.h>using namespace std;string str1,str2,s1,s2;//设从i位置开始的s的后缀串为s0ivoid z_function(string s,int n,int z[])//扩展KMP(Z函数),求s与s0i的最长公共前缀的长度{ for(int i=0 ;i<n ;i++) z[i]=0; for(int i=1,l=0,r=0; i<n ; i++) { if(i<=r) z[i]=min(r-i+1,z[i-l]); while(i+z[i]<n&&s[z[i]]==s[i+z[i]]) ++z[i]; if(i+z[i]-1>r) { l=i; r=i+z[i]-1; } }}int main(){ int z1[200]={},z2[200]={}; cin>>str1>>str2; int str1_len=str1.size(),str2_len = str2.size(); s1=str1+str2; s2 = str2 +str1; z_function(s1,s1.size(),z1); int len1=s1.size(),ans=0; for(int i=str1_len ;i<len1;i++) { if(z1[i]==len1-i) { ans=len1-i; break; } } z_function(s2,s2.size(),z2); int len2 = len1; for(int i=str2_len ;i<len2;i++) { if(z2[i]==len2-i) { ans=max(ans,len2-i); break; } } printf("%d\n",ans); return 0;}