[省选前题目整理][POJ 3461]Oulipo(KMP)

来源:互联网 发布:安卓数独源码 编辑:程序博客网 时间:2024/05/17 18:01

题目链接

http://poj.org/problem?id=3461

题目大意

给出模式串W和主串T,求W在T中的出现次数。

思路

最基础的KMP。

代码

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#define MAXN 1001000#define MAXM 10010using namespace std;char word[MAXM],text[MAXN];int next[MAXM];void getnext(char str[],int len){    int k=0;    next[1]=0;    for(int i=2;i<=len;i++)    {        while(k>0&&str[k+1]!=str[i]) k=next[k];        if(str[k+1]==str[i]) k++;        next[i]=k;    }}int match(char W[],int lenW,char T[],int lenT){    int ans=0;    getnext(W,lenW);    int k=0; //W已经匹配的长度    for(int i=1;i<=lenT;i++)    {        while(k>0&&W[k+1]!=T[i]) k=next[k];        if(W[k+1]==T[i]) k++;        if(k==lenW)        {            ans++;            k=next[k];        }    }    return ans;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        memset(next,0,sizeof(next));        scanf("%s",word+1);        scanf("%s",text+1);        printf("%d\n",match(word,strlen(word+1),text,strlen(text+1)));    }    return 0;}
0 0