HDU - 2087 剪花布条
#include<cstdio>
#include<cstring>
const int N = 1010, M = 1010;
char a[N],b[M];
int ne[M];
int n,m,c;
void get_next()
{
for(int i=2,j=0;i<=m;i++){
while(j&&b[i]!=b[j+1]) j=ne[j];if(b[i]==b[j+1]) j++;ne[i]=j;}
}
void get_kmp()
{
for(int i=1,j=0;i<=n;i++){
while(j&&a[i]!=b[j+1]) j=ne[j];if(a[i]==b[j+1]) j++;if(j==m) j=0,c++;}
}
int main()
{
while(scanf("%s",a+1)!=EOF){
if(a[1]=='#') break;scanf("%s",b+1);n=strlen(a+1),m=strlen(b+1);c=0;get_next();get_kmp();printf("%d\n",c);}return 0;
}