这是一道模板题。
给定一个字符串 AA 和一个字符串 BB,求 BB 在 AA 中的出现次数。AA 和 BB 中的字符均为英语大写字母或小写字母。
AA 中不同位置出现的 BB 可重叠。
输入格式
输入共两行,分别是字符串 AA 和字符串 BB。
输出格式
输出一个整数,表示 BB 在 AA 中的出现次数。
样例
Input | Output |
---|---|
zyzyzyz zyz | 3 |
1≤A,B 的长度 \leq 10 ^ 6≤106,AA、BB 仅包含大小写字母。
思路:模板题目,对kmp算法的直接应用
代码
#include<bits/stdc++.h>
using namespace std;
int ne[1000100],len1,len2;
char a[1000100],b[1000100];
void getnext()
{
int j,k;
j=-1,k=0;
ne[0]=-1;
while(k<len2)
{
if(j==-1||b[k]==b[j])
{
k++;
j++;
ne[k]=j;
}
else j=ne[j];
}
}
void kmp()
{
int j=0,k=0;
int ans=0;
while(k<len1)
{
if(j==-1||a[k]==b[j])
{
k++;
j++;
}
else j=ne[j];
if(j>=len2)
{
ans++;
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%s %s",a,b);
len1=strlen(a);
len2=strlen(b);
if(len2>len1)
printf("0\n");
getnext();
kmp();
return 0;
}