kmp模板

我的梦境 提交于 2020-01-16 00:01:39

模板题:https://www.luogu.org/problem/P3375

学习了kmp算法,虽然不是太懂,贴一个模板先。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000010
using namespace std;
char s1[MAXN],s2[MAXN];
int nxt[MAXN],f[MAXN],len1,len2;

void CalcNext()
{
    for(int i=2,j=0;i<=len2;i++)
    {
        while(j>0&&s2[i]!=s2[j+1]) j=nxt[j];
        if(s2[i]==s2[j+1]) j++;
        nxt[i]=j;
    }
}

void Kmp()
{
    for(int i=1,j=0;i<=len1;i++)
    {
        while(j>0&&(j==len2||s1[i]!=s2[j+1])) j=nxt[j];
        if(s1[i]==s2[j+1]) j++;
        f[i]=j;   //如果f[i]==len2说明s1以第i位结尾的字串和s2成功匹配 
    }
}

int main()
{
    scanf("%s %s",s1+1,s2+1);
    len1=strlen(s1+1);
    len2=strlen(s2+1);
    CalcNext();
    Kmp();
    for(int i=1;i<=len1;i++) if(f[i]==len2) printf("%d\n",i-len2+1);
    for(int i=1;i<=len2;i++) printf("%d ",nxt[i]);
    printf("\n");
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!