您的位置:首页 > 其它

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