链接:http://vjudge.net/contest/143819#problem/D
#include <bits/stdc++.h>
using namespace std;
int nexta[300000];
int a[300000],b[300000];
int s[300000],t[300000];
int n,w;
void getnexta()
{
memset(nexta,0,sizeof(nexta));
int k = -1,j = 0;
nexta[0] = -1;
while(j < w)
{
if(k == -1||t[k] == t[j])
{
nexta[j + 1] = k + 1;
j ++;
k ++;
}
else
{
k = nexta[k];
}
}
}
int kmp()
{
int ans= 0;
getnexta();
int i = 0,j = 0;
while(i < n && j < w)
{
if(j == -1 || s[i] == t[j])
{
i ++;
j ++;
}
else
{
j = nexta[j];
}
if(j == w)
{
ans ++;
j = nexta[j];
}
}
return ans;
}
int main()
{
scanf("%d%d",&n,&w);
for(int i = 0; i < n; i ++)
{
scanf("%d",&a[i]);
}
for(int i = 0; i < w; i ++)
{
scanf("%d",&b[i]);
}
if(w == 1)
{
printf("%d\n",n);
return 0;
}
n--,w--;
for(int i = 0; i < n; i ++)
{
s[i] = a[i + 1] - a[i];
}
for(int i = 0; i < w; i++)
{
t[i] = b[i + 1] - b[i];
}
int ans = kmp();
printf("%d\n",ans);
}