POJ3461 Oulipo

来源:互联网 发布:黑暗风格数据地图 编辑:程序博客网 时间:2024/06/14 14:53

一.原题链接:http://poj.org/problem?id=3461

二.题目大意:给一个模式串和一个匹配串,问模式串在匹配串中出现几次。

三.解题思路:KMP模板题:注意KMP每次匹配失效的时候的位移(最好举个例子就不会乱)。每次找到一个记得j = Next[j-1],回到前一个的对称前缀。

四.代码:

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAX_N = 10100,          INF = 0x3f3f3f3f;int Next[MAX_N];char pattern[MAX_N], match[1000100];void getNext(){    int i, k;    Next[0] = 0;    for(i = 1;  pattern[i]; i++){        k = Next[i-1];        while(pattern[i] != pattern[k] && k > 0)            k = Next[k-1];        if(pattern[i] == pattern[k])            Next[i] = k+1;        else            Next[i] = 0;    }}int KMP(){    getNext();    int i = 0, j = 0, cnt = 0;    while(match[i]){        while(j > 0 && pattern[j] != match[i])            j = Next[j-1];        if(pattern[j] == match[i])            i++, j++;        else            i++;        if(!pattern[j]){            cnt++;            j = Next[j-1];        }    }    return cnt;}int main(){    //freopen("in.txt", "r", stdin);    int T;    scanf("%d", &T);    while(T--){        scanf("%s%s", pattern, match);        printf("%d\n", KMP());    }    return 0;}


0 0
原创粉丝点击