题目链接:http://poj.org/problem?id=3461
刚刚学会KMP,纪念下
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
char W[100010], T[1000010];
int P[100010], lw, lt, ans;
void init(){
int j = 0;
memset(P, 0, sizeof(P));
for (int i = 1; i < lw; i++){
while (j > 0 && W[j] != W[i]) j = P[j];
if (W[j] == W[i]) j += 1;
P[i + 1] = j;
}
}
void kmp(){
int j = 0;
for (int i = 0; i < lt; i++){
while (j > 0 && W[j] != T[i]) j = P[j];
if (W[j] == T[i]) j += 1;
if (j == lw){
ans += 1;
j = P[j];
}
}
}
int main(){
int n;
while (~scanf("%d", &n)){
while (n--){
scanf("%s%s", W, T);
lw = strlen(W); lt = strlen(T);
init();
ans = 0;
kmp();
printf("%d\n", ans);
}
}
return 0;
}