[模板]KMP

 

修建模板库

 

kmp就是利用已经匹配过的信息降低复杂度。

每次记录当前位置的最长的后缀等于前缀,然后如果发现当前节点不能匹配,就直接往前跳nxt进行匹配。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s1[1000005],s2[1000005],s[2000005];
int nxt[2000005];
int main() {
    scanf("%s%s",s1,s2);
    int len=strlen(s2);
    for(int i=1;i<=len;i++) s[i]=s2[i-1];
    s[len+1]=' ';
    int len1=strlen(s1);
    for(int i=0;i<len1;i++) s[i+len+2]=s1[i];
    nxt[0]=0;
    for(int i=2,j=0;i<=1+len+len1;i++) {
        while(j&&s[i]!=s[j+1]) j=nxt[j];
        if(s[i]==s[j+1]) j++;
        nxt[i]=j;
        if(nxt[i]==len&&i>len+1) printf("%d\n",i-len-len);
    }
    for(int i=1;i<=len;i++) printf("%d ",nxt[i]);
    return 0;
} 
KMP

 

posted @ 2018-09-30 20:15  SWHsz  阅读(115)  评论(0编辑  收藏  举报