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串以及 10 8 10 11 9, 以及 11 9 11 12 10转换成同一个串?这样好套用kmp啊!
因为对应的数值的差值都是相同的! 令a[i]-=a[i+1], b[i]-=b[i+1]!
这样也就是将串的长度减少了1,这样就可以套kmp模板了!
别忘记对特殊情况考虑一下!

 1 #include<iostream>
 2 #include<cmath> 
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cstring>
 6 #define N 200005
 7 using namespace std;
 8 
 9 int f[N], a[N], b[N];
10 int n, w;
11 void getFail(){
12     f[0]=0; f[1]=0;
13     for(int i=1; i<w; ++i){
14         int j=f[i];
15         while(j && b[i] != b[j]) j=f[j];
16         if(b[i] == b[j]) f[i+1] = j+1;
17         else f[i+1] = 0;
18     }
19 }
20 
21 void findText(){
22     int j=0;
23     int cnt = 0;
24     for(int i=0; i<n; ++i){
25         while(j && a[i] != b[j])  j=f[j];
26         if(a[i] == b[j]) ++j;
27         if( j == w ) ++cnt;
28     } 
29     printf("%d\n", cnt);
30 }
31 
32 int main(){
33     scanf("%d%d", &n, &w);
34     for(int i=0; i<n; ++i){
35         scanf("%d", &a[i]);
36         if(i) a[i-1] -= a[i];
37     }
38     
39     for(int i=0; i<w; ++i){
40         scanf("%d", &b[i]);
41         if(i) b[i-1] -= b[i];
42     }
43     if(n==1 && w==1){
44         printf("%d\n", 1);
45         return 0;
46     }
47     else if(n==1){
48         printf("%d\n", 0);
49         return 0;
50     }
51     else if( w==1 ){
52         printf("%d\n", n);
53         return 0;
54     }
55     --n;
56     --w;
57     b[w] = -1e6;    
58     getFail();
59     findText();
60     return 0;
61 }
View Code

 

转载于:https://www.cnblogs.com/hujunzheng/p/3997196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux release 版本的区别,编译debug版本和编译release版本的区别

大项目的版本编译会区别debug和release&#xff0c;那debug和release会有什么区别呢&#xff1f;通过对比这两者的编译选项可以找到答案。1.对比编译过程debug:-DOS_LINUX -DDEBUG_VERSION -fno-builtin -pipe -Wall -fsigned-char -g-mlongcall -DCPUPPC85XX -mcpu8548 -m…

java模仿qq好友面板的布局(BoxLayout问题)

..............JLabel ll new JLabel(dlg.getNameText() ":" dlg.getIPText(), ii[index], JLabel.LEFT);tmp new JPanel();//将标签添加到这个面板中tmp.setLayout(new FlowLayout(FlowLayout.CENTER));tmp.setBackground(new Color(255, 0, 255));/** BoxLayo…

linux apple开发环境,Objective-C开发环境设置

如果要安装自己的Objective-C编程语言编程环境&#xff0c;则需要在计算机上安装文本编辑器和GCC编译器。1. 文本编辑器文本编辑器用于编写程序代码。一些常见的编辑器如&#xff1a;Windows Notepad&#xff0c;OS Edit命令&#xff0c;Brief&#xff0c;Epsilon&#xff0c;E…

codeforces C. Design Tutorial: Make It Nondeterministic

题意&#xff1a;每一个人 都有frist name 和 last name&#xff01; 从每一个人的名字中任意选择 first name 或者 last name 作为这个人的编号&#xff01;通过对编号的排序&#xff0c;得到每一个人 最终顺序&#xff01;比较中的序列能否得到给定输出的序列一致&#xff01…

Linux系统扩硬盘,Linux系统硬盘扩容

1、查看硬盘已经用了99%$ df -h #查看硬盘已经使用了99%文件系统 容量 已用 可用 已用% 挂载点devtmpfs 2.0G 0 2.0G 0% /devtmpfs 2.0G 12K 2.0G 1% /dev/shmtmpfs 2.0G 11M 2.0G 1% /runtmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup/dev/mapper/centos-root 47G 47G 687M 99% / ####…

codeforce A. Design Tutorial: Learn from Math

题意&#xff1a;将一个数拆成两个合数的和&#xff0c; 输出这两个数&#xff01;&#xff08;这道题做的真是TMD水啊&#xff09;开始的时候不知道composite numbers是啥意思&#xff0c;看了3遍才看懂.... 看懂之后又想用素数筛选法来做&#xff0c;后来决定单个判断一个数是…

设置密码命名是什么linux,orapwd 工具建立密码文件遵守的命名方法

orapwd 工具建立建立的密码文件 一定要orapw实例名吗我在11g和10g 测试是必须要 orapw实例名 才能登录成功以下是验证过程[oracleasm dbs]$ rm orapwasm[oracleasm dbs]$ orapwd fileorapwdasm passwordabcdefg entries10[oracleasm dbs]$ sqlplus /nologSQL*Plus: Release 10.…

codeforces B. Design Tutorial: Learn from Life

题意&#xff1a;有一个电梯&#xff0c;每一个人都想乘电梯到达自己想要到达的楼层&#xff01;从a层到b层的时间是|a-b|&#xff0c; 乘客上下电梯的时间忽略不计&#xff01;问最少需要多少的时间.... 这是一道神题啊&#xff0c;自己的思路不知不觉的就按照注解的思路走…

arm linux 中断优先级,ARM中断处理过程

以s3c2440 ARM9核为例&#xff1a;一:s3c2440 ARM处理器特性&#xff1a;1、S3C2440支持60个中断源&#xff0c;含子中断源&#xff1b;2、ARM9采用五级流水线方式&#xff1b;3、支持外部中断和内部中断&#xff1b;二、s3c2440 支持的寄存器&#xff1a;2.1 外部中断寄存器24…

codeforces D. Design Tutorial: Inverse the Problem

题意&#xff1a;给定一个矩阵&#xff0c;表示每两个节点之间的权值距离&#xff0c;问是否可以对应生成一棵树&#xff0c; 使得这棵树中的任意两点之间的距离和矩阵中的对应两点的距离相等&#xff01; 思路&#xff1a;我们将给定的矩阵看成是一个图&#xff0c;a 到 b会有…

linux ssh 远程会话保存,远程SSH会话和流程在断开后运行的5种方法

SSH或安全Shell简单来说就是一个人可以远程访问其他用户的其他系统&#xff0c;但仅在命令行即非GUI模式的方法。 在更多的技术术语中&#xff0c;当我们ssh到其他用户在某些其他系统上并在该机器上运行命令时&#xff0c;它实际上创建一个伪终端并将其附加到登录用户的登录she…

java模拟一个简单的QQ

v 项目源码https://github.com/hjzgg/java_QQ v 标题效果package testFour;import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.I…

修改Linux启动后的默认颜色,更改linux目录的默认颜色(我选择了Yellow)

在控制台下&#xff0c;用ls&#xff0c;就会发现&#xff0c;shell将不同类型的文件项目显示为不同的颜色。者可以提高效率&#xff0c;不用ls -l便能大概的把各个文件的类型情况了解一下。你有没有想过更改这个着色配置呢&#xff1f;其 实&#xff0c;在/etc下有一个DIR_COL…

AC_Dream 1216 G - Beautiful People

题意&#xff1a;有n个人每人有一个力气值Si,美丽值Bi&#xff0c;满足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以一起参见晚会&#xff0c;问最多有多少人可以一起参见晚会。思路&#xff1a; 我们根据S从小到大将所有人排序&#xff0c;然后看B最…

云主机用linux还是winows,云服务器一般使用什么系统?Linux还是Windows?

云服务器一般使用什么系统?最常用的就是Linux以及Windows系统&#xff0c;两大系统各有不同优势&#xff0c;大家选择上也是存在差异的&#xff0c;接下来跟着小编来了解一下吧。Windows系统&#xff1a;一般情况来说&#xff0c;Windows系统常用的是Server 2003和Server 2008…

c语言程序中return的作用,单片机C语言程序中return dat 什么意思

/* 打开 ISP,IAP 功能 */void ISP_IAP_enable(void){EA 0; /* 关中断 */ISP_CONTR ISP_CONTR & 0x18; /* 0001,1000 */ISP_CONTR ISP_CONTR | WaitTime; /* 写入硬件延时 */ISP_CONTR ISP_CONTR | 0x80; /* ISPEN1 */}/* 关闭 ISP,IAP 功能 *…

java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案

1 try {2 //向指定的ip和端口发送数据~&#xff01;3 //先说明一下数据是谁发送过来的&#xff01;4 byte[] ip InetAddress.getLocalHost().getHostAddress().getBytes();5 …

二级c语言程序设计bug,《C语言及程序设计》实践项目——发现Bug

返回&#xff1a;贺老师课程教学链接【项目1-sin泰勒展式中的错误】下面是sin函数的泰勒展式&#xff1a;(注&#xff1a;x取弧度值&#xff0c;而非角度值)编写了double mysin(double x)用于求sin值&#xff0c;却“死”在了123上。剧透一下&#xff0c;循环没有问题(当然问题…

AC_Dream 1224 Robbers(贪心)

题意&#xff1a;n个抢劫犯分别抢到的金钱是k1, k2, k3,...&#xff0c;一共得到的金钱是m&#xff0c; 但是在分钱的时候是按照x1/y, x2/y, x3/y,....的比例进行分配的&#xff01;这样的话 一些抢劫犯就会觉得不公平&#xff0c;不公平度为|xi/y - ki/m|(浮点运算)&#xff0…

C语言编程出图形,C语言画出各种图形

矩形&#xff1a;(里面是空的)******** ** ** ********Program ended with exit code: 0for (int i 0; i < 5; i ) {for (int j 0; j < 7; j ) {//用条件判断打出*号if (i 0 || i 4 || j 0 || j 6 ) {printf("*");}else{printf(" "…