poj3461—KMP裸题

来源:互联网 发布:unity3d 捏脸系统 编辑:程序博客网 时间:2024/05/16 12:08

题目大意:给出两个字符串p和s,求出p在s中出现的次数

#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;char p[10010],s[1000010];int next[10010];int lenp,lens,ans,m;void getnext(){    next[0]=-1;    int j=-1;    for (int i=1;i<lenp;i++)    {        while (j>-1 && p[j+1]!=p[i]) j=next[j];        if (p[j+1]==p[i]) j++;        next[i]=j;    }}int KMP(){    int j=-1,count=0;    for (int i=0;i<lens;i++)    {        while (j>-1 && p[j+1]!=s[i]) j=next[j];        if (p[j+1]==s[i]) j++;        if (j==lenp-1)        {            count++;            j=next[j];        }    }    return count;}int main(){    scanf("%d", &m);    while (m--)    {        scanf("%s%s", p,s);        lenp=strlen(p);        lens=strlen(s);        getnext();        ans=KMP();        printf("%d\n", ans);    }}


注:真实的next数组是程序中的next数组值+1

1 0
原创粉丝点击