这是一道模板题。
给定一个字符串 AA 和一个字符串 BB,求 BB 在 AA 中的出现次数。AA 和 BB 中的字符均为英语大写字母或小写字母。
AA 中不同位置出现的 BB 可重叠。
输入格式
输入共两行,分别是字符串 AA 和字符串 BB。
输出格式
输出一个整数,表示 BB 在 AA 中的出现次数。
样例
Inputcopy | Outputcopy |
---|---|
zyzyzyz zyz | 3 |
数据范围与提示
1<=A, B 的长度 ≤10^6,A、
#include<iostream>
#include<string.h>
using namespace std;
int ne[1000100],na,nb,s=0;
char a[1000010],b[1000010];
void nextt()
{
int i,p=0;
ne[0]=0;
for(i=1;i<=nb;i++)
{
while(p>0&&b[p]!=b[i]) p=ne[p-1];//跳到上一个和现在走到的字符串重叠的最长前缀
if(b[i]==b[p]) p++;
ne[i]=p;
}
}
void cc()
{
int i,p=0;
for(i=0;i<na;i++)
{
while(p>0&&a[i]!=b[p]) p=ne[p-1];
if(a[i]==b[p]) p++;
if(p>=nb)
{
s++;
p=ne[p-1];
}
}
}
int main()
{
cin>>a;
cin>>b;
na=strlen(a);
nb=strlen(b);
nextt();
cc();
cout<<s;
return 0;
}
B 仅包含大小写字母。