hdu1686(kmp)

http://acm.hdu.edu.cn/showproblem.php?pid=1686

#include<iostream>

using namespace std;

int next[10005];

char s[10005],t[1000006];

void getnext(char s[])

{

    int i=0,j=-1;

    next[0]=-1;

    int len=strlen(s);

    while(i<len)

    if(j==-1||s[i]==s[j])

    {

        i++;

        j++;

        next[i]=j;

    }

    else

        j=next[j];

}

int kmp(char s[],char t[])

{

    int num=0,i=0,j=0;

    int len=strlen(s);

    int lenn=strlen(t);

    while(i<lenn&&j<len)

    {

        if(j==-1||s[j]==t[i])

        {

            i++;

            j++;

        }

        else

            j=next[j];

        if(j>=len)

        {

            num++;

            //printf("\n%d\n",i);

            j=next[j];

        }

    }

    return num;

}

int main()

{

    int f;

    scanf("%d",&f);

    while(f--)

    {

        scanf("%s",s);

        scanf("%s",t);

        getnext(s);

        printf("%d\n",kmp(s,t));

    }

    return 0;

}

 

你可能感兴趣的:(HDU)