poj3461


#include <stdio.h>
#include <stdlib.h>
char str1[1000005],str2[1000005];
int next[1000005];
void get_next(int len2)
{
    int k=-1,j=0;
    next[0]=-1;
    while(j<len2)
    {
        if(k==-1||str2[j]==str2[k])
        {
            k++;j++;
            next[j]=k;
        }
        else
        k=next[k];
    }
}
int KMP(int len1,int len2)
{
    int i,j,sum;
    i=j=sum=0;
    get_next(len2);
    while(i<len1&&j<len2)
    {
        if(j==-1||str1[i]==str2[j])
        {
            i++;
            j++;
        }
        else
        j=next[j];
        if(j==len2)
        {
            sum++;
            j=next[j];
        }
    }
    return sum;
}
int main()
{
    int n,sum,len1,len2;
    {
        while(scanf("%d",&n)!=EOF)
        {
            while(n--)
            {
                scanf("%s%s",str2,str1);
                len1=strlen(str1);
                len2=strlen(str2);
                sum=KMP(len1,len2);
                printf("%d\n",sum);
                memset(str1,0,sizeof(str1));
                memset(str2,0,sizeof(str2));
            }
        }
    }
    return 0;
}

你可能感兴趣的:(poj3461)