ZOJ_3643Keep Deleting

//这题做了几次了,太金典了。

AC代码:

#include<stdio.h>
#include<string.h>
#define max  512005
char s[max];
char t[max];
int next[max];
int len1;
int len2;
int pre[max];
char a[max];
void get_next()
{
    int i=0;
    int j=-1;
    next[0]=-1;
    while(i<len1)
    {
        if(j==-1||t[i]==t[j])
        {
            i++;
            j++;
            next[i]=j;
        }
        else
        {
            j=next[j];
        }
    }
}
int main()
{
    while(scanf("%s%s",t,s)!=EOF)
    {
        len1=strlen(t);
        len2=strlen(s);
        int sum=0;
        memset(next,0,sizeof(next));
        get_next();
        int i,j=0,k=0;
        for(i=0;i<len2;i++,k++)
        {
            a[k]=s[i];
            while(j>0&&s[i]!=t[j])
            {
                j=next[j];
            }
            if(s[i]==t[j])
            {
                j++;
            }
            if(j==len1)
            {
                sum++;
                k-=len1;
                j=pre[k];
            }
            a[k+1]=0;
            pre[k]=j;
        }
        printf("%d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(ZOJ_3643Keep Deleting)