poj 3461Oulipo(扩展KMP)

 查找一个模式串在其他串中出现的次数;

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char W[10010],T[1000010];
int wlen,tlen;
int nex[10010];
void getNext()
{
    int j,k;
    j=0;
    k=-1;
    nex[0]=-1;
    while(j<wlen)
    {
        if(k==-1||W[j]==W[k])
        {
            nex[++j]=++k;
        }
        else k=nex[k];
    }
}
int KMP_count()
{
    int ans=0;
    int i,j=0;
    if(wlen==1&&tlen==1)
    {
        if(W[0]==T[0])return 1;
        else return 0;
    }
    getNext();
    for(i=0;i<tlen;i++)
    {
        while(j>0&&T[i]!=W[j])
          j=nex[j];
        if(W[j]==T[i])j++;
        if(j==wlen)
        {
            ans++;
            j=nex[j];
        }
    }
    return ans;
}
int main()
{

    int tcase;
    scanf("%d",&tcase);
    while(tcase--)
    {
        scanf("%s%s",&W,&T);
        wlen=strlen(W);
        tlen=strlen(T);

        printf("%d
",KMP_count());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Fy1999/p/9637299.html