HDU 2087 剪花布条(KMP基础应用)

  KMP基础,注意输入

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[1010],p[1010];
int sum,next[1010];
void getNext(char *p,int *next)  
{
    int j,k;
    next[0]=-1;
    j=0,k=-1;
    while(j<strlen(p)-1)
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
            k=next[k];
    }
}
int KMP(char *s,char *p)
{
    int i,j;
    i=0,j=0,sum=0;
    getNext(p,next);
    while(i<strlen(s))
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];     
        if(j==strlen(p))        
            sum++;
        if(i==strlen(s))
            return sum;      
    }
}

int main()
{
    while(scanf("%s",s)&&strcmp(s,"#")!=0)
    {
        scanf("%s",p);
        printf("%d
",KMP(s,p));
    }
原文地址:https://www.cnblogs.com/jifahu/p/5449319.html