题意
给定两个序列,在第一个序列中找与第二个序列相邻两数之差相同的连续子序列,能找到多少个
思路
先分别对两个子序列相邻两数做差,跑KMP,注意特判第二个序列长度为1的情况
代码
#include <cstdio>
int a[200001],aa[200001],b[200001],bb[200001],next[200001];
int n,w;
void makenext()
{
int q,k;
next[0]=0;
for(q=1,k=0;q<w-1;q++)
{
while(k>0&&bb[q]!=bb[k])
k=next[k-1];
if(bb[q]==bb[k])
k++;
next[q]=k;
}
}
int kmp()
{
int cnt=0,i,q;
for(i=0,q=0;i<n-1;i++)
{
while(q>0&&(bb[q]!=aa[i]||q==w-1))
q=next[q-1];
if(bb[q]==aa[i])
q++;
if(q==w-1)
{
cnt++;
}
}
return cnt;
}
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]);
for(int i=0;i<n-1;i++)
aa[i]=a[i+1]-a[i];
for(int i=0;i<w-1;i++)
bb[i]=b[i+1]-b[i];
makenext();
if(w==1)
printf("%d\n",n);
else printf("%d\n",kmp());
return 0;
}