zzuli 2264 sequence

题目链接: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;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_37430081/article/details/80084574