KMP算法模板

柴氏烤馍片,享誉全球(mdzz)
先求失配函数,再匹配
代码丑陋,眼瞎概不负责

【代码】

//KMP算法模板
#include<iostream>
#include<cstdio>
#include<cstring>
#define fo(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
char p[100000],s[100000];  //p:文本 s:模板 
int f[100000],a[100000],ans[100000];
void getfail()
{
    int j=0;
    int len=strlen(s+1);
// f[1]=0;
    fo(i,2,len)
    {
        while(j && s[j+1]!=s[i]) j=f[j];
        if(s[j+1]==s[i]) j++;
        f[i]=j;
    }
}
void find()
{
    int j=0;
    int len=strlen(p+1),ls=strlen(s+1);
    fo(i,1,len)
    {
        while(j && s[j+1]!=p[i]) j=f[j];
        if(s[j+1]==p[i]) j++;
        if(j==ls) ans[++ans[0]]=i-ls+1;  //匹配首位置 
    }
}
int main()
{
    scanf("%s%s",p+1,s+1);
    getfail();
    find();
    fo(i,1,ans[0]) printf("%d\n",ans[i]);
    return 0;
}
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/chai_jing/article/details/52121299
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞