首页 > 其他 > 详细

KMP记录

时间:2019-02-27 20:04:31      阅读:159      评论:0      收藏:0      [点我收藏+]

例题: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\n",i - lenb + 1);
            j = kmp[j];
        }
    }
    for(int i = 1;i <= lenb;i++)
        printf("%d ",kmp[i]);
    return 0;
}

 

KMP记录

原文:https://www.cnblogs.com/xyj1/p/10445843.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!