http://acm.hdu.edu.cn/showproblem.php?pid=2087
算是模板题吧,找到一个子串之后将模板串指针归零否则会重复计算。
#include<bits/stdc++.h>
using namespace std;
int nex[];
char s[],t[];
void kmp()
{
int szs=strlen(s),szt=strlen(t),i,j,k;
nex[]=nex[]=;
for(i=;i<szt;++i)
{
j=nex[i];
while(j&&t[i]!=t[j]) j=nex[j];
nex[i+]=t[i]==t[j]?j+:;
}
int ans=;
j=;
for(i=;i<szs;++i)
{
while(j&&s[i]!=t[j]) j=nex[j];
if(s[i]==t[j]){
if(j+==szt){j=;ans++;}
else j++;
}
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%s",s)!=EOF){
if(!strcmp(s,"#")) break;
scanf("%s",t);
kmp();
}
}