题面
差分一下,只要b和a的某一段完全相同就满足条件,跑一边kmp就行。
注意特判lenb=1的情况(差分出来就没了。。。)
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1000010;
int n,m,a[maxn],b[maxn],nxt[maxn];
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar(); }
while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar(); }
return x*f;
}
int kmp()
{
int re=0,p=0;
for(int i=2;i<=m;i++)
{
while(p>0&&b[p+1]!=b[i]) p=nxt[p];
if(b[p+1]==b[i]) p++;
nxt[i]=p;
}
p=0;
for(int i=1;i<=n;i++)
{
while(p>0&&b[p+1]!=a[i]) p=nxt[p];
if(b[p+1]==a[i]) p++;
if(p==m){re++;p=nxt[p];}
}
return re;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=m;i++)
b[i]=read();
n--;m--;
for(int i=1;i<=n;i++)
a[i]=a[i+1]-a[i];
for(int i=1;i<=m;i++)
b[i]=b[i+1]-b[i];
printf("%d\n",kmp());
return 0;
}