D - MUH and Cube Walls

D. MUH and Cube Walls

Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of Kiev got hold of lots of wooden cubes somewhere. They started making cube towers by placing the cubes one on top of the other. They defined multiple towers standing in a line as a wall. A wall can consist of towers of different heights.

Horace was the first to finish making his wall. He called his wall an elephant. The wall consists of w towers. The bears also finished making their wall but they didn‘t give it a name. Their wall consists of n towers. Horace looked at the bears‘ tower and wondered: in how many parts of the wall can he "see an elephant"? He can "see an elephant" on a segment of w contiguous towers if the heights of the towers on the segment match as a sequence the heights of the towers in Horace‘s wall. In order to see as many elephants as possible, Horace can raise and lower his wall. He even can lower the wall below the ground level (see the pictures to the samples for clarification).

Your task is to count the number of segments where Horace can "see an elephant".

Input

The first line contains two integers n and w (1 ≤ n, w ≤ 2·105) — the number of towers in the bears‘ and the elephant‘s walls correspondingly. The second line contains n integers ai (1 ≤ ai ≤ 109) — the heights of the towers in the bears‘ wall. The third line contains w integers bi (1 ≤ bi ≤ 109) — the heights of the towers in the elephant‘s wall.

Output

Print the number of segments in the bears‘ wall where Horace can "see an elephant".

Sample test(s)

input

13 52 4 5 5 4 3 2 2 2 3 3 2 13 4 4 3 2

output

2

Note

The picture to the left shows Horace‘s wall from the sample, the picture to the right shows the bears‘ wall. The segments where Horace can "see an elephant" are in gray.

#include <bits/stdc++.h>
using namespace std;
void makeNext(const int P[],int next[],int m)
{
    /*
    next[i]表示前i个字符中,最大前后缀相同的长度
    */
    int q,k;
    next[0]=0;
    for (q=1,k=0;q<m;++q)
    {
        while(k>0&&P[q]!=P[k])
            k = next[k-1];
        /*
        这里的while循环很不好理解!
        就是用一个循环来求出前后缀最大公共长度;
        首先比较P[q]和P[K]是否相等如果相等的话说明已经K的数值就是已匹配到的长的;
        如果不相等的话,那么next[k-1]与P[q]的长度,为什么呐?因为当前长度不合适
        了,不能增长模板链,就缩小看看next[k-1]
        的长度能够不能和P[q]匹配,这么一直递归下去直到找到
        */
        if(P[q]==P[k])//如果当前位置也能匹配上,那么长度可以+1
        {
            k++;
        }
        next[q]=k;
    }
}

int kmp(const int T[],const int P[],int next[],int n,int m)
{
    int i,q;
    makeNext(P,next,m);
    int res=0;
    for (i=0,q=0;i<n;++i)
    {
        while(q>0&&P[q]!= T[i])
            q = next[q-1];
        /*
        这里的循环就是位移之后P的前几个字符能个T模板匹配
        */
        if(P[q]==T[i])
        {
            q++;
        }
        if(q==m)//如果能匹配的长度刚好是T的长度那么就是找到了一个能匹配成功的位置
        {
            res++;
        }
    }
    return res;
}
int T[200005];
int P[200005];
int next[200005];
int n,m;
int main(){
    // freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&T[i]);
    }
    for(int i=0;i<m;i++){
        scanf("%d",&P[i]);
    }
    for(int i=0;i<n-1;i++){
        T[i]=T[i+1]-T[i];
    }
    n--;
    for(int i=0;i<m-1;i++){
        P[i]=P[i+1]-P[i];
    }
    m--;
    if(m==0){
        printf("%d\n",n+1);
        return 0;
    }
    if(n==0){
        printf("0\n");
        return 0;
    }
    makeNext(P,next,m);
    printf("%d\n",kmp(T,P,next,n,m));
    return 0;
}
时间: 2024-10-05 01:34:43

D - MUH and Cube Walls的相关文章

Codeforces Round #269 (Div. 2) D. MUH and Cube Walls KMP

D. MUH and Cube Walls Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of Kiev got hold of lots of wooden cubes somewhere. They started making cube towers by placing the cubes one on top of the other. T

codeforces MUH and Cube Walls

题意:给定两个序列a ,b, 如果在a中存在一段连续的序列使得 a[i]-b[0]==k, a[i+1]-b[1]==k.... a[i+n-1]-b[n-1]==k 就说b串在a串中出现过!最后输出b串在a串中出现几次! 思路: KMP变形!如何转换成KMP求解呢? 举一个例子说明一下: a: 5 10 8 10 11 9 11 12 10 15 b: 4 2 4 5 3 根据题意 a中的 10 8 10 11 9 与 b是匹配的, 11 9 11 12 10跟b也是匹配的! 如何将b串以及

CodeForces - 471D MUH and Cube Walls

CodeForces - 471D 记录差分,利用kmp对分别除去了第一个数的两个数组进行匹配 注意特判模式串长度为一的情况 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int maxn = 2e5 + 10; 6 int ans, n, m; 7 8 void find_substring(int pattern[], int text[]) { 9 vector<int

【CodeForces】471D MUH and Cube Walls KMP或者字符串HASH

想到两点就行: 1.相邻项相减,处理出相对高度,这样如果pattern或者text增加的话,就没问题了 2.KMP匹配O(n) HASH的话 ,我WA在第25组数据了,听说如果改为大素数取模就能AC KMP AC了 但是好奇怪我的KMP模板难道有问题?? 先贴KMP ac 代码 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring>

#269(div2) D. MUH and Cube Walls

题意:2个序列A,B,B可以自身全部加减某个数字,问B和A匹配的个数 思路:不管怎样,B序列中相邻2个数之间的差是不变的,然后KMP. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=200005; 4 5 int aa[N],a[N]; 6 int bb[N],b[N]; 7 int n,m; 8 int Next[N]; 9 10 void getnext() 11 { 12 int j, k; 13 j = 0

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

7月好题记录

Codeforces 1063 B. Labyrinth [确定性]给出一个迷宫\((1 \leq n,m \leq 2000)\),求从起点到各个点,能够做到在左移动次数不超过\(x\)次,右移动次数不超过\(y\)次的情况下到达的点的个数. 显然贪心地要求到达每个点时左右移动次数越少越好,但是两个关键字很难维护.而事实上,起点终点确定时,左移动次数确定时右移动次数一定确定.当终点在起点左侧时,最小化左移动次数即可:当终点在起点右侧时,依然最小化左移动次数即可.当然两者都最小化右移动次数也可以

HDOJ题目3309 Roll The Cube(BFS)

Roll The Cube Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 502    Accepted Submission(s): 181 Problem Description This is a simple game.The goal of the game is to roll two balls to two holes

HDU3309Roll The Cube(BFS)

Roll The Cube Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 484    Accepted Submission(s): 172 Problem Description This is a simple game.The goal of the game is to roll two balls to two holes