#include<bits/stdc++.h>
using namespace std;
#define maxn 2000006
int nxt[maxn],a[maxn],b[maxn],n,m,p,T,ans;
void getnxt()
{
int i=0,j=-1;
nxt[0]=-1;
while(i<m)
{
if(j==-1||b[i]==b[j])
{
i++;
j++;
nxt[i]=j;
}
else
j=nxt[j];
}
}
void kmp(int ide)
{
int i=ide,j=0;
while(i<n)
{
if(j==-1||b[j]==a[i])
{
i+=p;
j++;
}
else
j=nxt[j];
if(j==m)
{
ans++;
j=nxt[j];
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>T;
for(int u=1; u<=T; u++)
{
ans=0;
cin>>n>>m>>p;
for(int i=0; i<n; i++)
cin>>a[i];
for(int j=0; j<m; j++)
cin>>b[j];
getnxt();
for(int x=0; x<(n-(m-1)*p)&&x<p; x++)
kmp(x);
cout<<"Case #"<<u<<": "<<ans<<endl;
}
}
Sequence I (间隔p-KMP-由于kmp特点小于p)
最新推荐文章于 2021-04-04 00:51:11 发布