其他分享
首页 > 其他分享> > P1803 字符串匹配

P1803 字符串匹配

作者:互联网

题目描述

给定一个字符串AA 和一个字符串BB,求BB 在AA 中的出现次数。AA 和BB 中的字符均为英语大写字母或小写字母。

AA 中不同位置出现的BB 可重叠。

输入描述

输入共两行,分别是字符串AA 和字符串BB。

输出描述

输出一个整数,表示BB 在AA 中的出现次数。

样例输入

Copy to Clipboard
zyzyzyz
zyz

样例输出

Copy to Clipboard
3

数据范围

保证所有字符串长度\leq 10^6≤106

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
using namespace std;
const int maxn=1e6+10;
string s,p;
int next1[maxn];
void getnext1(string p){
    next1[0]=-1;
    int j=0,k=-1;
    while (j<p.length()- 1){
        if (k==-1||p[j]==p[k]){
            j++;
            k++;
            next1[j] = k;
        }
        else k=next1[k];
    }
}
int kmp(string s,string p){
    getnext1(p);
    int i=0,j=0;
    int res=0;
    while(i<s.length()){
        if(j==-1||s[i]==p[j]){
            i++;
            j++;
        }
        else j=next1[j];
        if(j==p.length()){ 
            res++; 
            i--; 
            j--; 
            j=next1[j]; 
        }
    }
    return res;
}
int main(){
    cin>>s>>p;
    cout<<kmp(s, p)<<endl;
    return 0;
}

 

标签:AA,匹配,BB,int,Clipboard,P1803,字符串,include
来源: https://www.cnblogs.com/ACM-YYDS/p/16367968.html