题目描述
这是一道模板题。
给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数。
A AA 中不同位置出现的 B BB 可重叠。
输入格式
输入共两行,分别是字符串 A AA 和字符串 B BB。
输出格式
输出一个整数,表示 B BB 在 A AA 中的出现次数。
样例
样例输入
zyzyzyz
zyz
样例输出
3
数据范围与提示
1≤A,B 1 \leq A, B1≤A,B 的长度 ≤106 \leq 10 ^ 6≤106,A AA、B BB 仅包含大小写字母。
kmp模板题
#include <cstring>
#include <cstdio>
const int N = 1e6+;
int la,lb,Next[N];
char A[N],B[N];
void Get_next()
{
int i=,j=-;
Next[i]=j;
for(;i<lb;)
{
if(j==-||B[i]==B[j]) i++,j++,Next[i]=j;
else j=Next[j];
}
}
int kmp()
{
Get_next();
int ans=,i=,j=;
for(;i<la&&j<lb;)
{
if(j==-||B[j]==A[i]) i++,j++;
else j=Next[j];
if(j==lb) {ans++;j=Next[j];}
}
return ans;
}
int main()
{
scanf("%s",A);
scanf("%s",B);
la=strlen(A),lb=strlen(B);
printf("%d\n",kmp());
return ;
}