思考:kmp的灵活运用,模式字符串当匹配成功时候,文本字符串的下一位和模式字符串的第 f[lenw] 开始匹配,详细见代码。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxw = 10010;
const int maxt = 1000010;
char w[maxw+5];
char t[maxt+5];
int f[maxw+5];
//Accepted 1716K 94MS G++ 973B 2014-04-05 20:20:23
void getFail() {
int len = strlen(w);
f[0] = 0, f[1] = 0;
int j = 0;
for(int i = 1; i < len; i++) {
j = f[i];
while(j && w[j]!=w[i]) j = f[j];
f[i+1] = w[j]==w[i] ? j+1 : 0;
}
}
int match() {
getFail();
int cnt = 0;
int lenw = strlen(w), lent = strlen(t);
int j = 0;
for(int i = 0; i < lent; i++) {
while(j && w[j]!=t[i]) j = f[j];
if(w[j]==t[i]) j++;
if(j==lenw) {
cnt++;
j = f[lenw]; // !!! key point.
}
}
return cnt;
}
int main()
{
int T;
scanf("%d", &T);
getchar();
while(T--) {
gets(w);
gets(t);
int res = match();
printf("%d\n", res);
}
return 0;
}