POJ 3461 KMP

来源:互联网 发布:java图形程序设计 编辑:程序博客网 时间:2024/06/02 02:00
//给你两个字符串p和s,求出p在s中出现的次数。////next数组的长度为小串的长度;//但是是在大串里运行。//过了我也不知道为什么。。。//找kmp原理。#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define maxn 5000000using namespace std;char p[maxn];char s[maxn];int next[maxn];int lenp,lens;void getnext(){    int i=0;int j=-1;    next[0]=-1;    while(i!=lenp)    {        if(s[i]==s[j] || j==-1)        {            i++;            j++;            next[i]=j;        }        else        j=next[j];    }}int kmp(){    int i=0;int j=0;int num=0;    while(i!=lens && j!=lenp)    {        if(s[i]==p[j] || j==-1)        {            i++;            j++;        }        else        j=next[j];        if(j==lenp)        {            num++;            j=next[j];        }    }     return num;}int main(){    int cas;    scanf("%d",&cas);    for(int ca=1;ca<=cas;ca++)    {        scanf("%s",p);        scanf("%s",s);        lenp=strlen(p);        lens=strlen(s);        getnext();        cout<<kmp()<<endl;    }}

0 0