先部分分,再进阶
先认清任务,再讨论算法
2022 CSP-J 第二轮 T3|逻辑表达式
一、完整题目
题目名称:P8815 [CSP-J 2022] 逻辑表达式(expr)
源程序文件:
输入文件:
时间限制:1 秒 内存限制:512 MiB
测试点:20 个等分点,每点 5 分
源程序文件:
expr.cpp输入文件:
expr.in 输出文件:expr.out时间限制:1 秒 内存限制:512 MiB
测试点:20 个等分点,每点 5 分
题目描述
给定一个布尔表达式,其中只包含:
- 数字
0和1; - 与运算符
&; - 或运算符
|; - 左、右括号
(、)。
运算优先级为:括号最高,& 高于 |;相同优先级的运算从左到右进行。表达式一定合法。
求值时采用短路规则:
- 对
a&b,若左侧a的值为0,结果已经确定为0,右侧b不再求值,称这里发生一次&的短路; - 对
a|b,若左侧a的值为1,结果已经确定为1,右侧b不再求值,称这里发生一次|的短路。
如果某一整段表达式因为外层运算短路而没有被求值,那么这段表达式内部原本可能发生的短路也不计入答案。
请输出整个表达式的值,以及实际求值过程中 & 和 | 分别发生短路的次数。
输入格式
从文件 expr.in 中读入数据。
输入仅一行,一个不含空格的合法布尔表达式 s。
输出格式
输出到文件 expr.out 中。
第一行输出表达式的值。
第二行输出两个整数,依次表示 & 的短路次数和 | 的短路次数。
样例 1
0&(1|0)|(1|1|1&0)
1
1 2
样例 2
(0|1&0|1|1|(1|1))&(0&1&(1|0)|0|1|0)&0
0
2 3
数据范围与测试点
所有数据保证表达式合法、只含上述字符、没有多余的连续套括号,并且 1≤|s|≤10^6。
| 测试点 | |s| | 特殊性质 |
|:---:|:---:|:---|
| 1~2 | ≤3 | 无 |
| 3~4 | ≤5 | 无 |
| 5 | ≤2000 | 不含 & |
| 6 | ≤2000 | 不含 | |
| 7 | ≤2000 | 不含括号 |
| 8~10 | ≤2000 | 无 |
| 11~12 | ≤10^6 | 不含 & |
| 13~14 | ≤10^6 | 不含 | |
| 15~17 | ≤10^6 | 不含括号 |
| 18~20 | ≤10^6 | 无 |
按测试点取并集,不把重叠分数相加
勾选已掌握的路线,观察它们共同覆盖哪些测试点。这里计算的是该卷条件下的理论覆盖分,不代表程序已经通过正式评测,也不对应任何一等奖分数线。
已掌握的解法
去重后覆盖0 / 100
实际提交时,须将已掌握的分支整合到同一份程序。勾选路线不会自动拼接代码。
测试点覆盖图
已覆盖未覆盖
查看原题评分依据
逐条看懂:性质、推导与完整代码
选择一条路线,查看它为什么成立,再进入同一算法的可视化与代码追踪。
选择得分路线
算法过程执行语句与图示同步
当前变量金色表示与上一步相比发生变化
已输出
尚未输出
0 / 0
键盘 ← → 单步,空格播放 / 暂停
执行记录(最近 8 步)
用边界检查:我真的读懂了吗?
先手算,再展开解释。带入演示时会核对当前路线的适用条件。