這是一道模板題。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; }