Codeforces 471D MUH and Cube Walls 题解

xiaoxiao2021-02-28  145

题意

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

思路

先分别对两个子序列相邻两数做差,跑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; }
转载请注明原文地址: https://www.6miu.com/read-17472.html

最新回复(0)