KMP模板

来源:互联网 发布:云南映象知乎 编辑:程序博客网 时间:2024/06/02 04:23

hdu 2087即一道模板题,这个没有什么要注意的,处理相关类型的题目一定要灵活运用f[i]的性质。(本人参考的是刘汝佳大神的写法,在蓝书上P212可以找到详细解释)

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAX=1004;char T[MAX],W[MAX];int n,m,f[MAX],sum;void getfail(char *W) {    f[0]=f[1]=0;    for (int i=1;i<m;i++) {        int j=f[i];        while (j&&W[j]!=W[i]) j=f[j];        f[i+1]=W[i]==W[j]?j+1:0;    }}void kmp(char *T,char *W) {    getfail(W);    int j=0;    for (int i=0;i<n;i++) {        while (j&&T[i]!=W[j]) j=f[j];        if (T[i]==W[j]) j++;        if (j==m) sum++,j=0;    }}int main() {    while (scanf("%s%s",T,W)&&T[0]!='#') {        n=strlen(T),m=strlen(W),sum=0;        kmp(T,W);        printf("%d\n",sum);    }    return 0;}