KMP模板

题目描述

给定一个字符串 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

数据规模与约定

保证 1A,B1061≤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;
}
View Code

  ❀完结撒花❀

posted @ 2021-02-02 20:29  上仙  阅读(45)  评论(0编辑  收藏  举报