KMP 看毛片

不知道为什么我写的这么复制…好像洛谷上的小伙伴就两三行啊…

这个坑留着以后再补

#include <cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int Next[1000005];
void Getn(char *p){
    Next[0]=-1;
    int len=strlen(p),j;
    for(int i=1;i<len;i++){
        j=Next[i-1];
        while(j>=0&&p[j+1]!=p[i])
            j=Next[j];
        if(p[j+1]==p[i])
            Next[i]=j+1;
        else Next[i]=-1;
    }
}
void kmp(char *s,char *p){
    Getn(p);
    int sl=strlen(s),pl=strlen(p),i=0,j=0;
    while(i<sl){
        if(s[i]==p[j]){
            i++;j++;
            if(j==pl){
                cout<<i-j+1<<endl;
                j=Next[i-1]+1;
            }
        }
        else{
            if(j==0)
                i++;
            else
                j=Next[j-1]+1;
        }
    }
}
int main()
{
    char s[1000005],p[1000005];
    scanf("%s%s",s,p);
    Getn(p);
    int l=strlen(p);
    kmp(s,p);
    for(int i=0;i<l;i++)
        cout<<(Next[i]+1)<<' ';
}

 

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/ffscas/article/details/86516661
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞