【模板】kmp

洛谷 P3375 

#include<cstdio>
#include<cstring>
#include<iostream>
#define sz 1000010
using namespace std;
int fail[sz];
char a[sz], b[sz];
inline void init(int n) {
    int j = 0;
    fail[1] = 0;
    for(int i = 2; i <= n; i++) {
        while(j>0 && b[i] != b[j+1]) j = fail[j];
        if(b[i] == b[j+1]) j++;
        fail[i] = j;
    }
}
inline void match(int n, int m) {
    int j = 0;
    for(int i = 1; i <= n; i++) {
        while(j>0 && a[i] != b[j+1]) j = fail[j];
        if(a[i] == b[j+1]) j++;
        if(j == m) printf("%d
",i-m+1), j = fail[j];
    }
}
inline void print(int n) {
    for(int i = 1; i <= n; i++) printf("%d ",fail[i]);
}
int main() {
    scanf("%s%s",a+1, b+1);
    int lena = strlen(a+1), lenb = strlen(b+1);
    init(lenb); match(lena, lenb); print(lenb);
    return 0;
}

 我学了一下午kmp,结果某人说noip考的字符串匹配hash就可以搞定QAQ

总之岁月漫长,然而值得期待。
原文地址:https://www.cnblogs.com/Hwjia/p/9509687.html