@(K ACMer)
KMP裸题一道…
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <string>
#include <queue>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef vector<int> vi;
#define xx first
#define yy second
const int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e6 + 40;
char s[maxn], p[maxn];
int nexts[maxn], plen;
void getnexts(char* p)
{
int k = -1, j = 0;
nexts[0] = -1;
while (j < plen - 1) {
if (k == -1 || p[j] == p[k]) {
k++, j++;
if (p[j] != p[k]) nexts[j] = k;
else nexts[j] = nexts[k];
} else {
k = nexts[k];
}
}
}
int kmp(char* s, char* p)
{
int ans = 0, i = 0, j = 0, slen = strlen(s);
while (i < slen) {
if (j == -1 || p[j] == s[i]) i++, j++;
else j = nexts[j];
if (j == plen - 1) ans++;
}
return ans;
}
int main(void) {
int T;
cin >> T;
while (T--) {
scanf("%s%s", s, p);
plen = strlen(p);
p[plen++] = '$';
p[plen] = '\0';
getnexts(p);
printf("%d\n", kmp(s, p));
}
return 0;
}