HDU 2594 Simpsons’ Hidden Talents(KMP求前缀后缀子串匹配)

本文介绍了一种用于匹配给定字符串前缀和后缀子串的高效算法,通过将字符串连接并求取next数组,实现最大匹配长度的计算。文章还提供了改进方法,即在两个字符串间插入特殊字符,确保匹配结果不超过原始字符串长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

题目大意:给定s1,s2,问s1的前缀子串和s2后缀子串的最大匹配时多少。

先拼在一起,然后求next,但是next求得的值的最大匹配串可能超过s1或者s2,所以要不断嵌套next数组来达到最大的但是又不超过s1和s2的子串。

#include<queue>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
char a[100005];
int nxt[100005];
int getNext(int len)
{
    int i = 0, j = -1;
    nxt[0] = -1;
    while(i < len) {
        if(j == -1 || a[i] == a[j]) {
            nxt[++i] = ++j;
        }
        else {
            j = nxt[j];
        }
    }
    return nxt[len];
}
int main()
{
    while (scanf("%s", a) != EOF) {
        int lena = strlen(a);
        scanf("%s", a + lena);
        int lenb = strlen(a + lena);
        int res = getNext(lena + lenb);
        while(res > lena || res > lenb) {
             res = nxt[res];
        }
        if(res > 0) {
            a[res] = 0;
            printf("%s ", a);
        }
        printf("%d\n", res);
    }
    return 0;
}


网上还有一种挺机智的做法,就是在s1和s2之间加一个特殊字符,s3 = s1_s2, 这样求出的答案一定不会超过s1和s2,太聪明了。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值