KMP 剪花布条hdoj2087

#include<stdio.h>
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string.h>
using namespace std;
int Next[1005]={-1};
char a[1005],b[1005];
int m,n,cnt;
void getNext()
{   int t=-1;
    int j=0;
    while(j<m-1)
    {
        if(t<0||b[j]==b[t])
        {
            t++;j++;
            Next[j]=(Next[j]==Next[t]?Next[t]:t);
        }
        else
        {
            t=Next[t];
        }
    }
    return;
}
int KMP()
{
    cnt=0;
    int i=0;
    int j=0;

        while(i <n &&j<m)
        {
            if(j<0 || a[i]==b[j])
            {
                i++;j++;
            }
            else
            {
                j=Next[j];
            }
            if(j==m)
            {
                cnt++;
                j=0;
            }

        }



    return cnt;

}
int main()
{
    while(scanf("%s",a)!=EOF)
    {
        if(a[0]=='#' && strlen(a) ==1) break;
        else
        {
            scanf("%s",b);
            n=strlen(a);
            m=strlen(b);
            getNext();
            printf("%d
",KMP());
        }
    }

    return 0;
}
原文地址:https://www.cnblogs.com/vector11248/p/5468050.html