题目链接:点击打开链接
KMP超级水的模板题......
// HDU 1686 Oulipo.cpp 运行/限制:124ms/1000ms
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char w[10005], t[1000005];
int Next[10005];
void MP() {
int n = strlen(w);
int i = 0, j = -1;
Next[0] = -1;
while (i < n) {
while (j > -1 && w[i] != w[j]) {
j = Next[j];
}
i++;
j++;
if (w[i] == w[j]) {
Next[i] = Next[j];
}
else{
Next[i] = j;
}
}
}
int KMP() {
int cnt = 0;
int n = strlen(w);
int m = strlen(t);
if (n > m) {
return 0;
}
MP();
int i = 0, j = 0;
while (i < m) {
while (j > -1 && t[i] != w[j]) {
j = Next[j];
}
i++;
j++;
if (j >= n) {
cnt++;
j = Next[j];
}
}
return cnt;
}
int main(){
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%s%s", w, t);
printf("%d\n", KMP());
}
}
return 0;
}