题目描述
给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。
A 中不同位置出现的 B 可重叠,详见样例二、四。
输入格式
输入共两行,分别是字符串 A 和字符串 B。
输出格式
输出一个整数,表示 B 在 A 中的出现次数。
样例数据
input
RachelAhhhh
h
output
5
input
RachelAhhhh
hh
output
3
input
RachelAhhhh
hhh
output
2
input
zyzyzyz
zyz
output
3
数据规模与约定
保证 1≤A,B的长度≤1061≤A,B的长度≤106
A ,B 仅包含大小写字母。
时间限制:1s1s
空间限制:256MB
这道是个模板题,但关于KMP我会另开一个博客详细说(我尽力)。
代码如下:
#include<bits/stdc++.h> using namespace std; const int N=1e6+1; string a,b; int ans; int p[N]; int main() { freopen("kmp.in","r",stdin); freopen("kmp.out","w",stdout); cin>>a>>b; p[0]=-1; int j=-1; for(int i=1;i<b.size();i++) { while(j>=0&&b[j+1]!=b[j]) j=p[j]; if(b[j+1]==b[i]) j++; p[i]=j; } j=-1; for(int i=0;i<a.size();i++) { while(j>-1&&b[j+1]!=a[i]) j=p[j]; if(b[j+1]==a[i]) j++; if(j==b.size()-1) { ans++; j=p[j]; } } cout<<ans; return 0; }
❀完结撒花❀