问题描述:给定字符串a和b,统计a中包含多少个b(可重叠)
代码:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define inf 0x7fffffff
int t,p[100],m,n,cnt;
string a,b;
void pre()//p数组的预处理 b自己跟自己匹配
{
int j=0;//初始化j=0,i=1错位
p[1]=0;//p数组存的数一定比下标小
for(int i=1;i<m;i++)
{
while(j>0&&b[i+1]!=b[j+1]) j=p[j];//下一位不匹配且可以往后拉就往后拉
if(b[i+1]==b[j+1]) j++;
p[i+1]=j;//在i+1这个位置 后缀与前缀能匹配到哪里 j代表自己的前缀
}
}
signed main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>a>>b;n=a.size(),m=b.size();
a=" "+a;b=" "+b;//从下标1开始找
pre();
int j=0;
for(int i=0;i<n;i++)
{
while(j>0&&a[i+1]!=b[j+1]) j=p[j];
if(a[i+1]==b[j+1]) j++;
if(j==m)
{
cnt++;//cnt用来统计匹配的数量
j=p[j];//继续寻找匹配(可重叠)
}
}
cout<<cnt<<endl;
return 0;
}