给出两个串,和一个p,子串只能每隔p匹配母串,问子串能匹配母串多少次,
用的o(mlogn)就水过
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
typedef long long LL;
using namespace std;
const int maxn=1e6+5;
typedef long long LL;
int num,sum,n,m;
int nex[maxn],P[maxn],T[maxn];
void makeNext()
{
int q,k;
nex[0]=0;
for (q=1, k = 0; q < m; ++q)
{
while(k>0 && P[q]!=P[k])
k=nex[k-1];
if(P[q]==P[k])
{
k++;
}
nex[q]=k;
}
}
void kmp()
{
int i, q;
makeNext();
for (int l=0;l<num;l++)
{
for (int i=l, q=0; i<n; i+=num)
{
while(q>0&&P[q]!=T[i])
q=nex[q-1];
if (P[q]==T[i])
{
q++;
}
if (q==m)
{
sum++;
}
}
}
}
int main()
{
int t;
scanf("%d", &t);
for(int k=1;k<=t;k++)
{
memset(P,0,sizeof(P));
memset(T,0,sizeof(T));
scanf("%d%d%d",&n,&m,&num);
for (int i=0;i<n;i++)
scanf("%d",&T[i]);
for(int i=0;i<m;i++)
scanf("%d",&P[i]);
sum = 0;
kmp();
printf("Case #%d: %d\n",k,sum);
}
}