不多說先粘代碼
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000000+5;
char text[maxn];
char pat[10000 + 5];
int nex[10005];
int cnt;
void Build()
{
int len = strlen(pat);
int k = 0;
nex[0] = -1;
nex[1] = 0;
for (int i = 2; i <= len; i++) {
while (k >= 0 && pat[i-1] != pat[k]) k = nex[k];
nex[i] = ++k;
}
}
void KMP()
{
int len_pat = strlen(pat), len_text = strlen(text);
if (len_pat < 1 || len_text < 1 || len_pat > len_text)
return;
int i = 0, j = 0;
while (i < len_text) {
if (j == -1 || pat[j] == text[i]) {
i++;j++;
}
else
j = nex[j];
if (j == len_pat) {
cnt++;
j = nex[j];
}
}
}
int main()
{
//freopen("in", "r", stdin);
int t;
cin >> t;
while (t--) {
scanf("%s", pat);
scanf("%s", text);
//printf("%s\n", pat);
//printf("%s\n", text);
cnt = 0;
memset(nex, 0, sizeof(nex));
Build();
KMP();
cout << cnt << endl;
}
return 0;
}