题目类型 kmp
题目意思
问一个最长 10000 的串在一个最长 100 0000 的串中出现了多少次 (可重叠)
解题方法
kmp的基本用法 理解清楚失配函数的定义即可
参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e4 + 10;
int next[maxn];
char w[maxn], t[maxn*100];
void get_next() {
int lenw = strlen(w);
next[0] = next[1] = 0;
for( int i=1; i<lenw; i++ ) {
int f = next[i];
while(f && w[f] != w[i]) f = next[f];
if(w[f] == w[i]) next[i+1] = f + 1;
else next[i+1] = 0;
}
}
int main() {
freopen("out", "r", stdin);
int tcase;
scanf("%d", &tcase);
while(tcase--) {
scanf("%s%s", w, t);
get_next();
int lenw = strlen(w), lent = strlen(t);
int ans = 0, f = 0;
for( int i=0; i<lent; i++ ) {
while(f && w[f] != t[i]) f = next[f];
if(w[f] == t[i]) f++;
if(f == lenw) {
f = next[f];
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}