这道题数据量不是很大,暴力匹配也能过,不过刚学kmp,就拿来练练手。
思路: kmp匹配,匹配成功一次,则从母串这个地方往后继续匹配,成功几次 答案就是几。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char str[1005],p[1005];
int Next[1005],ans,len1,len2;
void mynext()
{
int k=0;
for(int i=2; i<=len2; i++)
{
while(k!=0 && p[k]!=p[i-1])
k = Next[k];
if(p[k] == p[i-1])
k++;
Next[i]=k;
}
}
void kmp()
{
mynext();
int j = 0;
for(int i = 0; i < len1; i++)
{
while(j && str[i] != p[j])
j = Next[j];
if(str[i] == p[j])
j++;
if(j == len2)
{
ans ++;
j = 0;
}
}
return;
}
int main()
{
while(scanf("%s",str) !=EOF)
{
if(str[0] =='#')
break;
scanf("%s",p);
len1 = strlen(str);
len2 = strlen(p);
ans = 0;
kmp();
printf("%d\n",ans);
}
return 0;
}