hdu 2087

题目链接


STL+KMP


 

#include <cstdio>

#include <cstring>

using namespace std;

int main()

{

    int i,len,sum;

    char *p;

    char a[3005],b[3005];

    while(scanf("%s",a)&&a[0]!='#')

    {

        scanf("%s",b);

        len=strlen(b);

        sum=0;

        for(i=0,p=a;p=strstr(p,b);p+=len)

        {

            sum++;

        }

        printf("%d\n",sum);

    }

    return 0;

}

 



 

#include <cstdio>

#include <cstring>

#define MAXN 1000000

using namespace std;

char p[MAXN],s[MAXN]; //s 母串

int next[MAXN];

void get_next(char *P,int *next,int len1)

{

    int j,k;

    j=0;k=-1;next[0]=-1;

    while(j<len1)

    {

        if(k==-1||p[j]==p[k])

        {

            j++;k++;

            next[j]=k;

        }

        else

        k=next[k];

    }

}

int kmp()

{

    int i,j,k,len1,len2,t;

    i=0;j=0;k=0;

    len1=strlen(p);

    len2=strlen(s);

    get_next(p,next,len1);

    while(i<len2)

    {

        t=i;       //去掉为可重叠

        if(s[i]==p[j])

        { i++;j++; }

        else

        {

            if(j==-1)

            {i++;j=0;}

            else

            j=next[j];

        }

        if(j==len1)

        {k++;i=t+len1;} //可重叠为k++;

    }

        return k;

}



int main()

{

    int n;

    while(scanf("%s",s)&&s[0]!='#')

    {

        scanf("%s",p);

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

    }

    return 0;

}



你可能感兴趣的:(HDU)