题意
t组数据,每组先输入匹配串,再输入文本串,输出匹配串在文本串中出现的次数
思路
kmp优化的板子
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int MAXN = 10010;
char s1[MAXN], s2[1000100];
int nxt[MAXN];
inline void get_next() {
int len1 = strlen(s1);
int i = 0, j = -1;
nxt[0] = -1;
while (i < len1) {
if (j == -1 || s1[i] == s1[j]) {
j++, i++;
if (s1[i] == s1[j])nxt[i] = nxt[j];
else nxt[i] = j;
}
else j = nxt[j];
}
}
inline int kmp() {
int ans = 0;
int len1 = strlen(s1), len2 = strlen(s2);
int i = 0, j = 0;
get_next();
while (i < len2) {
if (j == -1 || s1[j] == s2[i]) {
i++, j++;
}
else {
j = nxt[j];
}
if (j == len1) {
ans++;
j = nxt[j];
}
}
return ans;
}
int main() {
int t;
scanf("%d", &t);
for (int k = 1; k <= t; k++) {
scanf("%s", s1);
scanf("%s", s2);
int ans = kmp();
printf("%d\n", ans);
}
return 0;
}