基础KMP 开始学AC自动机了 先搞清楚KMP
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000010;
char a[maxn], p[maxn];
int f[maxn];
void getFail()
{
int m = strlen(p);
f[0] = f[1] = 0;
for(int i = 1; i < m; i++)
{
int j = f[i];
while(j && p[i] != p[j])
j = f[j];
f[i+1] = p[i] == p[j] ? j+1 : 0;
}
}
void find()
{
int cnt = 0;
int j = 0;
int n = strlen(a);
int m = strlen(p);
for(int i = 0; i < n; i++)
{
while(j && a[i] != p[j])
j = f[j];
if(a[i] == p[j])
j++;
if(j == m)
cnt++;
}
printf("%d\n", cnt);
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s %s", p, a);
getFail();
find();
}
return 0;
}