hdu-2594 kmp求两个字符串的前缀和后缀的最长公共长度

题目链接: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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值