剪花布条

hdoj2087

题目大意:

解决:kmp,与poj3461神似,只需做小小的改动即可

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s[1005],t[1005];
int next[1005],lens,lent;
void getnext()
{
    int i=1,j=0;
    next[1]=0;
    while(i<=lent)
    {
         if(j==0 || t[i]==t[j])
        {
            
            i++;   j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
void kmp()
{
     int i=1,j=1,cnt=0;
    while(i<=lens)
    {
        if(j==0 || s[i]==t[j])
        {
            i++;j++;//由于是非重复数据,所以j要退回到1就行了,从头匹配
            if(j>lent){cnt++;j=1;}
        }
        else j=next[j];
    }
    printf("%d\n",cnt);
}
int main()
{//由于这个地方忘记了要从s+1,和t+1开始,一直在调试,竟然忘了
    while(scanf("%s%s",s+1,t+1),s[1]!='#')
    {
        lens=strlen(s+1);
        lent=strlen(t+1);
        getnext();
        kmp();
    }
 //   system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/hpustudent/p/2163554.html