LibreOJ #103.子串查找 KMP

题目描述

这是一道模板题。ios

给定一个字符串 A和一个字符串 B,求 B 中的出现次数。AB 中的字符均为英语大写字母或小写字母。ide

A 中不一样位置出现的 B 可重叠。ui

输入格式

输入共两行,分别是字符串 A 和字符串 Bspa

输出格式

输出一个整数,表示 A 中的出现次数。code

样例

样例输入

zyzyzyz
zyz

样例输出

3

数据范围与提示

1<=A,B的长度 <=10 ^ 6A B 仅包含大小写字母。blog

题目分析

裸题kmpci

AC代码

#include<iostream> #include<string>
using namespace std; const int maxn = 1000010; string s, p; int _next[maxn]; void getnext(string p){ _next[0] = -1; int j = 0, k = -1; while (j < p.length() - 1){ if (k == -1 || p[j] == p[k]){ j++; k++; _next[j] = k; } else k = _next[k]; } } int kmp(string s, string p){ getnext(p); int i = 0,j = 0; int res = 0; while (i < s.length()){ if (j == -1 || s[i] == p[j]){ i++; j++; } else j = _next[j]; if (j == p.length()) { res++; i--; j--; j = _next[j]; } } return res; } int main() { ios::sync_with_stdio(false); cin >> s >> p; cout << kmp(s, p) << endl; return 0; }
View Code

题解效率

相关文章
相关标签/搜索