题意:给俩字符串,问第一个字符串在第二个里面出现了几次。
解法:kmp。好裸……
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
char w[10005], t[1000005];
int p[10005], lw, lt, ans;
void getnext()
{
int j = 0;
memset(p, 0, sizeof p);
for(int i = 1; i < lw; i++)
{
while(j > 0 && w[j] != w[i]) j = p[j];
if(w[j] == w[i]) j += 1;
p[i + 1] = j;
}
}
void find()
{
int j = 0;
for(int i = 0; i < lt; i++)
{
while(j > 0 && w[j] != t[i]) j = p[j];
if(w[j] == t[i]) j += 1;
if(j == lw)
{
ans += 1;
j = p[j];
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
ans = 0;
scanf("%s%s", w, t);
lw = strlen(w);
lt = strlen(t);
getnext();
find();
printf("%d
", ans);
}
return 0;
}