hdu 1686看毛片算法

#include"stdio.h"
#include"string.h"

char a[1000010], b[10010] ;
int next[10010] = {-1} ;

void getnext(char p[],int leth)
{
    int i,j=-1;
    for(i=1;i<leth;i++)
    {
        while(j!=-1&&p[i]!=p[j+1])j=next[j];
        if(p[i]==p[j+1])j++;
        next[i]=j;
    }
}

int kmp(char t[],char p[],int leth1,int leth2)
{
    int i,j=-1;
    int count=0;
    getnext(p,leth2);
    for(i=0;i<leth1;i++)
    {
        while(j!=-1&&t[i]!=p[j+1])j=next[j];
        if(t[i]==p[j+1])j++;
        if(j==leth2-1)
            count++;
    }
    return count;
}

int main( )
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%s",b,a);
        printf("%d\n",kmp(a,b,strlen(a),strlen(b)));
    }
    return 0;
}

 

posted @ 2012-04-12 21:19  朝圣の路  阅读(4500)  评论(0编辑  收藏  举报