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

題解效率

相關文章
相關標籤/搜索