KMP

来源:互联网 发布:大数据公司被收购 编辑:程序博客网 时间:2024/06/01 07:34

KMP模板

#include <cstdio>#include <string.h>#include <iostream>using namespace std;char T[1000], P[1000];int f[1000];void getf(){    int m = strlen(P);    f[0] = 0, f[1] = 0;    for(int i = 1; i < m; i++){        int j = f[i];        while(j && P[i] != P[j]) j = f[j];        if(P[i] == P[j]) j++;        f[i+1] = j;    }}void KMP(){    int n = strlen(T), m = strlen(P), flag = 0;    getf();//预处理    int j = 0; //当前结点编号,起始点为0号结点    for(int i = 0; i < n; i++){        while(j && P[j] != T[i]) j = f[j];        if(P[j] == T[i]) j++;        if(j == m) {printf("找到了,起始位置(字符串开头位置为1):%d\n", i-m+2); j = f[j]; flag = 1;}    }    if(flag == 0) printf("未找到匹配字符串\n");}int main(){    printf("请输入模板字符串:");    while(scanf("%s", T) != EOF){        getchar();        printf("请输入需要匹配的字符串:");        while(cin >> P && P[0] != '#'){            getchar();            KMP();            printf("请输入需要匹配的字符串:");        }        printf("请输入模板字符串:");    }    return 0;}


KMP算法例题

题目1 http://poj.org/problem?id=3461

//poj 3461 Oulipo 最简单的KMP题,找出第一个字符串在第二个字符串中出现次数。

#include <cstdio>#include <string.h>#include <iostream>using namespace std;char T[1000010], P[1000010];int f[1000010], flag;void getf(){    int m = strlen(P);    f[0] = 0, f[1] = 0;    for(int i = 1; i < m; i++){        int j = f[i];        while(j && P[i] != P[j]) j = f[j];        if(P[i] == P[j]) j++;        f[i+1] = j;    }}void KMP(){    int n = strlen(T), m = strlen(P);    flag = 0;    getf();//预处理    int j = 0; //当前结点编号,起始点为0号结点    for(int i = 0; i < n; i++){        while(j && P[j] != T[i]) j = f[j];        if(P[j] == T[i]) j++;        if(j == m) { j = f[j]; flag++;}    }}int main(){    int SUM;    cin >> SUM;    while(SUM--){        scanf("%s", P);        getchar();        scanf("%s", T);        KMP();        printf("%d\n", flag);    }    return 0;}





0 0
原创粉丝点击