Codeforces 471D MUH and Cube Walls 题解

来源:互联网 发布:深圳美工师到哪考 编辑:程序博客网 时间:2024/06/14 21:50

题意

给定两个序列,在第一个序列中找与第二个序列相邻两数之差相同的连续子序列,能找到多少个

思路

先分别对两个子序列相邻两数做差,跑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;}