题目链接:https://cn.vjudge.net/problem/HDU-2594
转自:https://blog.csdn.net/qq_39562952/article/details/82222137
题意:有两个字符串s1,s2,求s1前缀s2后缀的最长公共长度。
思路:两个字串拼接一下,问题就变成了求s前缀和后缀的最长公共长度,也就是kmp算法中next数组,但是仍然需要注意的是,next数组求得的数据,前缀有可能包含了s2,后缀有可能包含了s1,所以答案必须是小于其中两者小的的长度,**也就是原本应该输出next的最后一个数据,而现在应该是对next的不断进行递归,直到小于其中两者小的的长度。**因为next最后一个数据存储的是如果失配后应该跳转到的位置x,即x的前缀是s2后缀的子集。
#include <bits/stdc++.h>
using namespace std;
int ans;
char w[100005],t[50005];
int f[100005];
void getfail(char *p)
{
int m=strlen(p);
f[0]=0;
f[1]=0;
for(int i=1; i<m; i++)
{
int j=f[i];
while(j&&p[i]!=p[j])
j=f[j];
f[i+1]=p[i]==p[j]?j+1:0;
}
}
int main()
{
while(~scanf("%s",w))
{
memset(f,0,sizeof(f));
scanf("%s",t);
int l1=strlen(w),l2=strlen(t),l3;
l3=l1+l2;
strcat(w,t);
// printf("%s\n",w);
getfail(w);
ans=f[strlen(w)];
while(ans>l1||ans>l2)
{
ans=f[ans];
}
if(!ans)
{
printf("0\n");
continue;
}
for(int i=0; i<ans; i++)
{
printf("%c",w[i]);
}
printf(" %d\n",ans);
}
}