pku 3461 Oulipo

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXT 1000005
#define MAXW 10005

char str[MAXT],pat[MAXW];
int next[MAXW];

void getNext(int len)
{
    int j=0,k=-1;
    next[0]=-1;
    while(j<len)
    {
        if(k==-1 || pat[j]==pat[k])
        {
            ++j;
            ++k;
            next[j]=k;

            /*    用了修正的next更加慢。。。110MS -> 125MS

                 if(pat[j]==pat[k]) next[j]=next[ next[k] ];
                        else next[j]=k;*/
        }
        else k=next[k];
    }
}

int kmp(int len,int plen)
{
    int i=0,j=0,cnt=0;
    while(i<len && j<plen)
    {
        if(j==-1 || str[i]==pat[j])
        {
            ++i;
            ++j;
            if(j==plen)
            {
                j=next[j];
                cnt++;
            }
        }
        else j=next[j];
    }
    return cnt;
}

int main()
{
    int len1,len2,cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%s %s",pat,str);
        len1=strlen(str);
        len2=strlen(pat);
        getNext(len2);
        //  for(int i=0;i<=len2;i++) printf("%d ",next[i]); printf("\n");
        printf("%d\n",kmp(len1,len2));
    }
    return 0;
}

 

posted @ 2010-08-28 00:10  菜到不得鸟  阅读(143)  评论(0)    收藏  举报