题目链接:http://acm.zzuli.edu.cn/problem.php?id=2264
就是个kmp模板题,记得将子串、母串预处理一下就好了
AC代码:
#include<string.h> #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e6+10; #define next nn int next[maxn]; int a[maxn],b[maxn],t[maxn],tt[maxn]; void kmp(int x[],int m,int next[]) { int i,j; j=next[0]=-1; i=0; while(i<m) { while(-1!=j && x[i]!=x[j]) j=next[j]; next[++i]=++j; } } int KMP(int x[],int m,int y[],int n) { int i,j; int ans=0; kmp(x,m,next); i=j=0; while(i<n) { while(-1!=j && y[i]!=y[j]) j=next[j]; i++; j++; if(j>=m) ans++,j=next[j]; } return ans; } int main() { int n,m; while(~scanf("%d %d",&n,&m)) { memset(next,0,sizeof(next)); for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n-1; i++) t[i]=a[i+1]-a[i]; for(int i=0; i<m; i++) cin>>b[i]; for(int i=0; i<m-1; i++) tt[i]=b[i+1]-b[i]; cout<<KMP(tt,m,t,n)<<endl; } }