这是一道模板题。ios
给定一个字符串 A和一个字符串 B,求 B在 A 中的出现次数。A 和 B 中的字符均为英语大写字母或小写字母。ide
A 中不一样位置出现的 B 可重叠。ui
输入共两行,分别是字符串 A 和字符串 B。spa
输出一个整数,表示 B 在 A 中的出现次数。code
zyzyzyz zyz
3
1<=A,B的长度 <=10 ^ 6,A B 仅包含大小写字母。blog
裸题kmpci
#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; }