【2025刷题笔记】- 出错的或电路
刷题笔记合集🔗
出错的或电路
问题描述
小兰是一名电路工程师,她发现某一批次的或门电路不稳定,具体现象为计算两个二进制数的或操作时,第一个二进制数中某两个比特位会出现交换,交换的比特位置是随机的,但只交换这两个位,其他位不变。
很明显,这个交换可能会影响最终的或结果,也可能不会有影响。
为了评估影响和定位出错的根因,小兰需要研究在各种交换的可能下,最终的或结果发生改变的情况有多少种。
输入格式
第一行有一个正整数 ,其中
。
第二行有一个长为 的二进制数,表示与电路的第一个输入数,即会发生比特交换的输入数。
第三行有一个长为 的二进制数,表示与电路的第二个输入数。注意第二个输入数不会发生比特交换。
输出格式
输出只有一个整数,表示会影响或结果的交换方案个数。
样例输入
3
010
110
6
011011
110110
样例输出
1
4
数据范围
| 样例 | 解释说明 |
|---|---|
| 样例1 | 原本010和110的或结果是110,但第一个输入数可能会发生如下三种交换: 1、交换第1个比特和第2个比特,第一个输入数变为100,计算结果为110,计算结果不变 2、交换第1个比特和第3个比特,第一个输入数变为010,计算结果为110,计算结果不变 3、交换第2个比特和第3个比特,第一个输入数变为001,计算结果为111,计算结果改变 故只有一种交换会改变计算结果。 |
| 样例2 | 原本011011和110110的或结果是111111,但是第一个输入数发生如下比特交换会影响最终计算结果: 1、交换第1个比特和第3个比特,第一个输入数变为110011,计算结果变为110111 2、交换第1个比特和第6个比特,第一个输入数变为111010,计算结果变为111110 3、交换第3个比特和第4个比特,第一个输入数变为010111,计算结果变为110111 4、交换第4个比特和第6个比特,第一个输入数变为011110,计算结果变为111110 其他交换都不会影响计算结果,故输出4。 |
- 输入的两个二进制数长度均为
题解
这道题目要求我们计算在第一个二进制数的两个位交换后,会改变或运算结果的交换方案数量。
首先需要理解,二进制的或运算有个特点:只要两个输入中的任意一位是1,结果就是1;只有当两个输入的对应位都是0时,结果才是0。
基于这个特性,可以分析什么情况下交换会影响结果:
- 如果第二个数的某一位是1,那么无论第一个数对应位是什么,或运算结果都是1,所以交换不会影响这一位的结果。
- 只有当第二个数的某一位是0时,交换才可能影响结果:
- 如果第一个数对应位是0,交换后变为1会改变结果
- 如果第一个数对应位是1,交换后变为0会改变结果
因此,我们只需要关注第二个数中为0的位置,并计算合法的交换方案。
具体算法步骤:
- 统计第一个数中1和0的总数量
- 统计第二个数为0的位中,第一个数对应位为0的数量(x)和为1的数量(y)
- 计算可能改变结果的交换方案数:
- 对于第二个数中值为0、第一个数中值为0的位,需要与第一个数中值为1的位交换才能改变结果,所以有x*a种可能(其中a是第一个数中1的总数)
- 对于第二个数中值为0、第一个数中值为1的位,需要与第一个数中值为0的位交换才能改变结果,所以有y*b种可能(其中b是第一个数中0的总数)
- 需要减去重复计算的情况:x*y
最终结果为:x * a + y * b - x * y
时间复杂度:O(N),其中N是二进制数的长度,需要遍历一遍两个二进制数。 空间复杂度:O(1),只需要几个变量来存储计数结果。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
# 读取输入
n = int(input())
bin1 = input() # 第一个二进制数(可能发生交换)
bin2 =
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记
