Codeforces 471D 差分+kmp
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 471D 差分+kmp相关的知识,希望对你有一定的参考价值。
题意 给出两个长度为n,m的a,b序列 问n中有多少个连续长度为m的序列,同时加/减去某一个数后和b相同
c序列同时加上/减去某个数,其相邻差不变.
算出相邻差,跑一遍kmp即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e6+20; int n,m,a[N],b[N],c[N],d[N]; int fail[N]; void getfail() { int i=0,j=-1; fail[0]=-1; while(i<m) { if(j==-1||d[i]==d[j]) { fail[i+1]=j+1; i++,j++; } else j=fail[j]; } } void KMP() { getfail(); int ans=0; int i=0,j=0; while(i<n) { // cout<<i<<‘ ‘<<j<<endl; if(j==-1||c[i]==d[j]) { i++,j++; if(j==m) { ans++; j=fail[j]; } } else j=fail[j]; } if(m==0) ans=n+1; cout<<ans<<endl; } int main() { while(cin>>n>>m) { for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<m;i++) scanf("%d",&b[i]); for(int i=0;i<n;i++) c[i]=a[i+1]-a[i]; for(int i=0;i<m;i++) d[i]=b[i+1]-b[i]; n--,m--; /* for(int i=0;i<n;i++) cout<<c[i]<<‘ ‘; cout<<endl; for(int i=0;i<m;i++) cout<<d[i]<<‘ ‘; */ KMP(); } return 0; }
以上是关于Codeforces 471D 差分+kmp的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 432D Prefixes and Suffixes (KMP后缀数组)
Codeforces 126B. Password (KMP)