hdu 2087 剪花布条

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

#define MAXN 1005

char str[MAXN],pat[MAXN];
int nextval[MAXN];

void getNextval(int len)
{
    int j=0,k=-1;
    nextval[0]=-1;
    while(j<len)
    {
        if(k==-1 || pat[j]==pat[k])
        {
            ++j;
            ++k;
            //next[j]=k;
            if(pat[j]==pat[k]) nextval[j]=nextval[ nextval[k] ];
            else nextval[j]=k;
        }
        else k=nextval[k];
    }
}

int kmp(int len,int plen)
{
    getNextval(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)
            {
                cnt++;
                j=0;
            }
        }
        else j=nextval[j];
    }
    return cnt;
}

int main()
{
    while(scanf("%s",str))
    {
        if(str[0]=='#') break;
        scanf("%s",pat);
        int len1=strlen(str),len2=strlen(pat);
        printf("%d\n",kmp(len1,len2));
    }
    return 0;
}

posted @ 2010-08-29 01:13  菜到不得鸟  阅读(106)  评论(0)    收藏  举报