codeforces 126B kmp串匹配问题

本文深入探讨了KMP算法在特定问题中的应用,通过实例详细解释了如何利用next数组进行字符串匹配,强调了next数组在KMP算法中的关键作用。

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

/*此题不像传统意义上的串匹配,此题只要一个串模式串是需要根据题目条件在母串中找的,很好的题在kmp理解上加深对该算法的理解,再次注意next的重要性且next数组只和模式穿有关,next数组是存放当前最长匹配长度串的,因此相同next数组中的值表示的串是相同的,详解见代码很好的题*/

#include<iostream>  
#include<cstdio>  
#include<cstring>  
using namespace std;  
char ch[1000005];  
int next[1000005];  
int hash[1000005];  
void getnext()  
{  
    int len=strlen(ch);  
    int i=0,j=-1;  
    next[0]=-1;  
    while(i<len)  
    {  
        if(j==-1 || ch[i]==ch[j])  
        {  
            i++;  
            j++;  
            next[i]=j;  
            //cout  << "next[" << i << "]" << " "<<next[i]<<endl;	//不懂主函数中while循环 就可以打印出来看看有助于直观理解 
            hash[j]++;                        //hash表统计长度为j的子串数目,因为在kmp串匹配中长度相同的串所表示的串是相同的  
        }  
        else  
        j=next[j];  
    }  
}  
int main()  
{  
    while(cin>>ch)  
    {  
        int len=strlen(ch);  
        memset(hash,0,sizeof(hash));  
        getnext();  
        int i=len;  
        int flag=0;  
		hash[next[len]]--;  
        while(next[i])                             //通过回溯的方法判断整个模式串 
        {  
            if(hash[next[i]])                     //查找向前回溯后的next是否存在一个长度  
            {  
                flag=1;  
                break;  
            }  
            else  
            {  
                next[i]=next[next[i]];  
            }
        }  
        if(!flag)  
        cout<<"Just a legend"<<endl;  
        else  
        {  
            for(int j=0;j<next[i];j++)  
            cout<<ch[j];  
            cout<<endl;  
        }  
    } 
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值