CodeForces–471D--MUH and Cube Walls(KMP)
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".
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.
Print the number of segments in the bears' wall where Horace can "see an elephant".
Input
13 5
2 4 5 5 4 3 2 2 2 3 3 2 1
3 4 4 3 2
Output
2
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.
题意:
见图,给定两段参差不齐的成墙,问图中左边灰色的可以在右边匹配到多少次?
匹配时可以上下移动,即只关心每一个柱的差值
分析:
一开始想到了用KMP,可是傻B地直接暴力的。。。。果断TLE
后来看了题解,很巧妙的处理了一下:
基于一段连续区间无论怎么变他们的相对位置不会变,所以分别将两个序列相邻的元素作差,一段区间的相对位置不会变,所以正好可以用差值去匹配。
代码:
1 #include<bits/stdc++.h>
2 const int N=2e5+7;
3 int len1,len2,a[N],b[N],f[N],p[N];
4 void kmp_pre(int *x,int m,int *next)//以下感谢kuangbin神主提供的模板。
5 {
6 int i,j;
7 j=next[0]=-1;
8 i=0;
9 while(i<m)
10 {
11 while(-1!=j&&x[i]!=x[j]) j=next[j];
12 next[++i]=++j;
13 }
14 }
15 void prekmp(int *x,int m,int *kmpnext)
16 {
17 int i,j=-1;
18 kmpnext[0]=-1;
19 i=0;
20 while(i<m)
21 {
22 while(-1!=j&&x[i]!=x[j]) j=kmpnext[j];
23 if(x[++i]==x[++j]) kmpnext[i]=kmpnext[j];
24 else kmpnext[i]=j;
25 }
26 }
27 int next[N];
28 int kmp_count(int *x,int m,int *y,int n)
29 {
30 int i,j,ans=0;
31 kmp_pre(x,m,next);
32 i=j=0;
33 while(i<n)
34 {
35 while(-1!=j&&y[i]!=x[j]) j=next[j];
36 i++,j++;
37 if(j>=m)
38 {
39 ans++;
40 j=next[j];
41 }
42 }
43 return ans;
44 }
45 int main()
46 {
47 int w,n;
48 while(~scanf("%d%d",&w,&n))
49 {
50 len1=0,len2=0;
51 for(int i=0;i<w;i++)
52 {
53 scanf("%d",&a[i]);
54 if(i) f[len1++]=a[i]-a[i-1];
55 }
56 for(int i=0;i<n;i++)
57 {
58 scanf("%d",&b[i]);
59 if(i) p[len2++]=b[i]-b[i-1];
60 }
61 if(n==1)
62 {
63 printf("%d\n",w);
64 continue;
65 }
66 int ans=kmp_count(p,len2,f,len1);
67 printf("%d\n",ans);
68 }
69 return 0;
70 }
CodeForces–471D--MUH and Cube Walls(KMP)的更多相关文章
- CodeForces 471D MUH and Cube Walls -KMP
Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of ...
- Codeforces Round #269 (Div. 2) D - MUH and Cube Walls kmp
D - MUH and Cube Walls Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & % ...
- Codeforces Round #269 (Div. 2)-D. MUH and Cube Walls,KMP裸模板拿走!
D. MUH and Cube Walls 说实话,这题看懂题意后秒出思路,和顺波说了一下是KMP,后来过了一会确定了思路他开始写我中途接了个电话,回来kaungbin模板一板子上去直接A了. 题意: ...
- D - MUH and Cube Walls
D. MUH and Cube Walls Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant ...
- [codeforces471D]MUH and Cube Walls
[codeforces471D]MUH and Cube Walls 试题描述 Polar bears Menshykov and Uslada from the zoo of St. Petersb ...
- 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串中出现过!最后输出 ...
- Codeforces 471 D MUH and Cube Walls
题目大意 Description 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. Input 第一行给出数字N.N在[2,1000000 ...
- MUH and Cube Walls
Codeforces Round #269 (Div. 2) D:http://codeforces.com/problemset/problem/471/D 题意:给定两个序列a ,b, 如果在a中 ...
- CF471D MUH and Cube Walls
Link 一句话题意: 给两堵墙.问 \(a\) 墙中与 \(b\) 墙顶部形状相同的区间有多少个. 这生草翻译不想多说了. 我们先来转化一下问题.对于一堵墙他的向下延伸的高度,我们是不用管的. 我们 ...
随机推荐
- U盘重装系统
一.准备工作 (1)8G以上空间的U盘一个: (2)将U盘制作好启动工具: 1.下载启动工具制作软件(常用的有:大白菜.电脑店.老毛桃.快启动等等一系列软件,直接百度这些软件的名称,或者百度U盘启动制 ...
- springboot的一些注解
springboot注解以及一些晦涩难理解的点介绍 @Validated 用于注入数值校验的注解(JSR303数据校验) @PropertySource 用于加载指定的配置文件,例如@Property ...
- css动画之旋转翻牌效果
1.我们先设置两个盒子大小,颜色等等,然后定位重叠在一起,最后再进行动画设置 例子如下: <style> .box { height: 300px; width: 300px; posit ...
- 关于python导包问题
讨论采用 * 模糊导入或者 单独导入变量 会在不同文件生成不同的对象 .a └── mypackage ├── a.py ├── b.py ├── c.py b.py内容如下 import c d ...
- QT 给工程添加图片
先打开如图的打开方式 然后我们看到以下的画面,选择下面的 然后我们选择如下:,这里我们要注意我们的图片资源有一定要和QRC资源在同一个文件夹中 之后我们通过在stylesheet里面设置来使用我们添加 ...
- poj 1655 找树的重心
树形DP 求树的重心,即选择一个结点删去,使得分出的 若干棵树的结点数 的最大值最小 #include<map> #include<set> #include<cmath ...
- Codeforces Round #593 (Div. 2) D. Alice and the Doll
题目:http://codeforces.com/problemset/problem/1236/D思路:机器人只能按照→↓←↑这个规律移动,所以在当前方向能够前进的最远处即为界限,到达最远处右转,并 ...
- Docker从0开始之部署一套2048
创建容器并运行程序 [root@localhost ~]# docker run -d -p 8888:80 daocloud.io/daocloud/dao-2048:master-a2c564e ...
- 使用jvisualvm远程监控tomcat(阿里云ECS)
写在前面: 使用jvisualvm远程监控tomcat(阿里云ECS),连接是报错:service:jmx:rmi:////jndi/rmi:IP:端口// 连接到 IP:端口,网上找了很多资料, ...
- UVA - 1640 The Counting Problem (数位dp)
题意:统计l-r中每种数字出现的次数 很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊) 从高位向低位走,设状态$(u,lim,ze)$表示 ...