KMP记录

例题:luogu

P3375 【模板】KMP字符串匹配

知识点:1.KMP模板,熟悉KMP

    2.理解KMP过程:失配时,是从后缀转向前缀。即失配时,匹配串是从尾转到头继续匹配,被匹配串不改变。

    3.注意字符数组的处理技巧:输入时从c[1]开始输入,求长度时也是求strlen(c + 1)。

#include <bits/stdc++.h>
using namespace std;
int lena,lenb;
char a[1000010],b[1000010];
int kmp[1000010];
int main()
{
    scanf("%s",a + 1);
    scanf("%s",b + 1);
    lena = strlen(a + 1);
    lenb = strlen(b + 1);
    int j = 0;
    for(int i = 2;i <= lenb;i++)
    {
        while(j && b[j + 1] != b[i])j = kmp[j];
        if(b[j + 1] == b[i])j++;
        kmp[i] = j;
    }
    j = 0;
    for(int i = 1;i <= lena;i++)
    {
        while(j && b[j + 1] != a[i])j = kmp[j];
        if(b[j + 1] == a[i])j++;
        if(j == lenb)
        {
            printf("%d
",i - lenb + 1);
            j = kmp[j];
        }
    }
    for(int i = 1;i <= lenb;i++)
        printf("%d ",kmp[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/xyj1/p/10445843.html