Kmp 加深理解 之 poj 3461
2014-09-11 12:24
288 查看
// [9/11/2014 Sjm] /* 求模式串在文本中出现的次数。。。 关键在于:在计算过第一次匹配位置后时,利用 next[模式串.size()] 去继续计算。。。 详见代码注释。。。。 */
#include <iostream> #include <cstdlib> #include <cstdio> #include <string> using namespace std; int N, M, next[10005]; string S, T; void getNext() { int j = 0, k = -1; next[0] = -1; while (j < M) { if ((-1 == k) || (T[j] == T[k])) { ++j; ++k; // 注意:next[M] 的值是存在的(T[M] = '\0') if (T[j] != T[k]) next[j] = k; else next[j] = next[k]; }else k = next[k]; } } int Solve() { getNext(); int i = 0, j = 0, ans = 0; while (i < N) { if ((-1 == j) || (S[i] == T[j])) { ++i; ++j; if (M == j) { ++ans; j = next[j]; // 据next[M] 的值继续计算 } }else j = next[j]; } return ans; } int main() { //freopen("input.txt", "r", stdin); int Case; scanf("%d", &Case); while (Case--) { cin >> T >> S; N = S.size(); M = T.size(); printf("%d\n", Solve()); } return 0; }
相关文章推荐
- Kmp 加深理解 之 poj 3461
- poj 3461 Oulipo kmp 预处理
- poj 3461 KMP
- POJ 3461 Oulipo(KMP)
- POJ 3461 Oulipo(KMP)
- POJ 2752 Seek the Name, Seek the Fame(KMP 理解应用)
- poj 3461:Oulipo(KMP模版)
- KMP模板题 poj 3461 Oulipo
- POJ 3461 kmp
- poj3461 kmp 模板题
- POJ 3461 Oulipo(简单KMP)
- poj 3461 Oulipo (KMP)
- [KMP求模式在主串出现次数]POJ 3461 Oulipo
- POJ 3461 KMP
- poj3461——Oulipo(KMP)
- 【KMP模板】POJ 3461
- kmp poj 3450 3461
- POJ 3461 Oulipo(KMP统计子串出现次数)
- poj3461之kmp入门
- KMP入门题 Hdu 1711 2594 3746 HUST 1010 Poj 3461 2752 2406 1961 FZU 1901