kmp模板

模板题: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
",i-len2+1);
    for(int i=1;i<=len2;i++) printf("%d ",nxt[i]);
    printf("
");
    return 0;
}
原文地址:https://www.cnblogs.com/BakaCirno/p/11315602.html