POJ 3461 Oulipo(KMP统计子串出现次数)

来源:互联网 发布:js防水怎么样 编辑:程序博客网 时间:2024/06/07 19:21

题目链接:poj3461

题目大意:

典型的KMP    统计模式串在主串中出现的次数

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;#define maxn 1000010#define mem(a,val) memset(a,val,sizeof (a) )char w[maxn],t[maxn];int wlen,tlen;int nexts[maxn];void getnexts(){int j,k;    j=0;    k=-1;    nexts[0]=-1;    while(j<wlen)    {        if(k==-1||w[j]==w[k])        {            nexts[++j]=++k;        }        else k=nexts[k];    }}int kmp(){int ans=0;int i,j;if(wlen==1&&tlen==1){if(w[0]==t[0])return 1;else return 0;}getnexts();for(i=0,j=0;i<tlen;i++){while(j>0&&t[i]!=w[j])j=nexts[j];if(t[i]==w[j])j++;if(j==wlen){ans++;j=nexts[j];}}return ans;}int main(){    int cas;    scanf("%d",&cas);    while(cas--){mem(nexts,0);scanf("%s%s",w,t);wlen=strlen(w);tlen=strlen(t);printf("%d\n",kmp());}    return 0;}



阅读全文
0 0