HDU - 2594 Simpsons’ Hidden Talents KMP nxt[ ] 应用 求相同前后缀

本文深入探讨了字符串匹配算法,特别是KMP算法的应用,通过解决一个实际问题——寻找两个字符串间最长的公共前后缀,展示了算法的具体实现过程。文章提供了两段代码示例,详细解释了如何通过KMP算法优化字符串匹配效率,适用于处理大量文本数据。
摘要由CSDN通过智能技术生成

HDU - 2594 Simpsons’ Hidden Talents

题意:

求第一个字符串的前缀与第二个字符串的后缀最长相同的长度。输出这个前缀 和 他的长度

思路:

1、在两个字符串相连接处添加一个特殊符号(字符串中不会出现的符号)就行

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
int nxt[2*maxn];
char a[maxn],b[maxn],c[2*maxn];
int len;
void getnxt()
{
    int i,j;
    i = 0;
    j = nxt[i] = -1;
    while(i<len)
    {
        if(j==-1 || c[i]==c[j])
        {
            i++,j++;
            if(c[i]!=c[j])
                nxt[i] = j;
            else
                nxt[i] = nxt[j];
        }
        else
            j = nxt[j];
    }
}
int main()
{
    while(~scanf("%s",a))
    {
        scanf("%s",b);
        int alen = strlen(a);
        int blen = strlen(b);
        int m = min(alen,blen);
        memset(c,0,sizeof(c));
        memset(nxt,0,sizeof(nxt));
        strcpy(c,a);
        strcat(c,"#");
        strcat(c,b);
        len = strlen(c);
        getnxt();
        int n = nxt[len];
        if(n<1)
            printf("0\n");
        else
        {
            for(int i=0;i<n;i++)
                printf("%c",c[i]);
            printf(" %d\n",n);
        }
    }
    return 0;
}

2、一开始想的不够完全,少了一种情况。。。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
int nxt[2*maxn];
char a[maxn],b[maxn],c[2*maxn];
int len;
void getnxt()
{
    int i,j;
    i = 0;
    j = nxt[i] = -1;
    while(i<len)
    {
        if(j==-1 || c[i]==c[j])
        {
            i++,j++;
            if(c[i]!=c[j])
                nxt[i] = j;
            else
                nxt[i] = nxt[j];
        }
        else
            j = nxt[j];
    }
}
int main()
{
    while(~scanf("%s",a))
    {
        scanf("%s",b);
        int alen = strlen(a);
        int blen = strlen(b);
        memset(c,0,sizeof(c));
        memset(nxt,0,sizeof(nxt));
        strcpy(c,a);
        strcat(c,b);
        len = strlen(c);
        getnxt();
        int n = nxt[len];
        if(n)
        {
           if(n>min(alen,blen))     //输出不到n个字符  
           {
               if(alen<blen)
                printf("%s %d\n",a,alen);
               else
                printf("%s %d\n",b,blen);
           }
           else       //输出n个字符
           {
               for(int i=0;i<n;i++)
                printf("%c",c[i]);
               printf(" %d\n",n);
           }
        }
        else    //无相同前后缀
            printf("0\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值