简单的改一下Kmp,如果看不懂,可以去复习一下kmp
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 2000500
typedef long long int ll;
int T;
int n , m , p;
int a[maxn] , b[maxn];
int nxt[maxn];
void get_next()
{
memset(nxt,0,sizeof(nxt));
int i = 0 , j = -1;
nxt[0] = -1;
while( i < m )
{
if( j == -1 || b[j] == b[i] )
{
i++;
j++;
nxt[i] = j;
}
else j = nxt[j];
}
}
int kmp(int x)
{
int i = x , j = 0;
while( i < n )
{
if( j == -1 || a[i] == b[j] )
{
i+=p;
j++;
}
else return 0;
if( j == m )
{
return 1;
}
}
return 0;
}
int main()
{
int cas = 0;
cin >> T;
while(T--)
{
cin >> n >> m >> p;
for(int i = 0 ; i < n ; ++i)
{
scanf("%d",&a[i]);
}
for(int i = 0 ; i < m ; ++i)
{
scanf("%d",&b[i]);
}
get_next();
int ans = 0;
for(int i = 0; i+p*(m-1) < n; i++)
{
if( kmp(i) )ans++;
}
printf("Case #%d: %d\n",++cas,ans);
}
}