[POJ][3461][KMP] Oulipo

前言


重新写了KMP的模板,这回完全照搬《算法导论》P926的伪代码。

题目大意


给出两个字符串,问第二个字符串中存在多少个字串能与第一个字符串匹配。

思路


KMP模板题。

代码


#include
#include
using namespace std;
#define T_SIZE 1000000
#define P_SIZE 10000
int next[P_SIZE+2];
char T[T_SIZE+2],P[P_SIZE+2];
//T是被匹配的串。
//P是模式串。
void COMPUTE_PREFIX_FUNCTION(char P[])
{
    int m=strlen(P+1);
    next[1]=0;
    for(int k=0,q=2;q<=m;q++)
    {
        while(k>0&&P[k+1]!=P[q])
            k=next[k];
        if(P[k+1]==P[q])
            k++;
        next[q]=k;
    }
}
int KMP_MATCHER(char T[],char P[])
{
    int n=strlen(T+1),m=strlen(P+1);
    COMPUTE_PREFIX_FUNCTION(P);
    int sum=0;
    for(int i=1,q=0;i<=n;i++)
    {
        while(q>0&&P[q+1]!=T[i])
            q=next[q];
        if(P[q+1]==T[i])
            q++;
        if(q==m)
        {
            sum++;
            q=next[q];
        }
    }
    return sum;
}
int main()
{
    int t;
    for(scanf("%d",&t);t>0;t--)
    {
        scanf("%s%s",P+1,T+1);
        //字符串都是从下标1开始的。 
        printf("%d\n",KMP_MATCHER(T,P));
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注