kmp算法的简单应用,同上一个不同的是这里要统计个数,只需将kmp函数稍作修改就行了。
#include <cstdio>
#include <cstring>
using namespace std;
int m,n;
char w[10005],t[1000005];
int next[10005];
void get()
{
int j=0,k=-1;
next[0]=-1;
while(j<m)
{
if(k==-1||w[j]==w[k])
{
next[++j]=++k;
}
else
k=next[k];
}
}
int kmp()
{
int sum=0;
int i=0,k=0;
while(i<n&&k<m)
{
if(k==-1||t[i]==w[k])
{
k++;i++;
}
else
{
k=next[k];
}
if(k==m) //如果将这个判断放在循环的开始,循环的条件要改为i<=n&&k<=m 否则会漏解
{
//i=i-m+1; //这里并不需要改变i的位置
k=next[k];
sum++;
}
}
return sum;
}
int main()
{
//freopen("in.txt","r",stdin);
int g;
scanf("%d",&g);
while(g--)
{
memset(next,0,sizeof(next));
scanf("%s%s",w,t);
m=strlen(w);
n=strlen(t);
get();
int ans=kmp();
printf("%d\n",ans);
}
}