#6927. CSP-J 2022 逻辑表达式(expr) T3
CSP-J 2022 逻辑表达式(expr) T3
逻辑表达式(expr)
题目描述
逻辑表达式是计算机科学中的重要概念和工具,包含逻辑值、逻辑运算、逻辑运算优先级等内容。
在一个逻辑表达式中,元素的值只有两种可能:
0:表示假;1:表示真。
元素之间有多种可能的逻辑运算,本题中只需考虑如下两种:
- 与:符号为
&; - 或:符号为
|。
其运算规则如下:
| a | b | a & b | a | b |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | ||
| 1 | 0 | ||
| 1 | |||
在一个逻辑表达式中还可能有括号。规定运算顺序如下:
- 括号内的部分先运算;
- 两种运算并列时,
&运算优先于|运算; - 同种运算并列时,从左向右运算。
例如:
- 表达式
0|1&0的运算顺序等同于0|(1&0); - 表达式
0&1&0|1的运算顺序等同于((0&1)&0)|1。
此外,对逻辑表达式的计算可以采用一种短路策略:
- 在形如
a&b的逻辑表达式中,先计算 a 部分的值。如果 a = 0,那么整个逻辑表达式的值一定为 0,无需再计算 b 部分的值。 - 在形如
a|b的逻辑表达式中,先计算 a 部分的值。如果 a = 1,那么整个逻辑表达式的值一定为 1,无需再计算 b 部分的值。
现在给你一个逻辑表达式,你需要计算出它的值,并统计在计算过程中,两种类型的短路各出现了多少次。
需要注意:如果某处短路包含在更外层被短路的部分内,则不被统计。
例如,在表达式 1|(0&1) 中,尽管 0&1 是一处短路,但由于外层的 1|(0&1) 本身就是一处短路,无需再计算 0&1 部分的值,因此不应将这里的 0&1 计入一次短路。
输入格式
从文件 expr.in 中读入数据。
输入共一行,一个非空字符串 s,表示待计算的逻辑表达式。
输出格式
输出到文件 expr.out 中。
输出共两行:
- 第一行输出一个字符
0或1,表示这个逻辑表达式的值; - 第二行输出两个非负整数,分别表示计算过程中,形如
a&b和a|b的短路各出现了多少次。
样例 1
输入
0&(1|0)|(1|1|1&0)
输出
1
1 2
解释
该逻辑表达式的计算过程如下:
0&(1|0)|(1|1|1&0)
= (0&(1|0))|((1|1)|(1&0))
= 0|((1|1)|(1&0))
= 0|(1|(1&0))
= 0|1
= 1
各步说明:
- 用括号标明计算顺序。
- 计算最左侧的
&,发生一次形如a&b的短路。 - 计算中间的
1|1,发生一次形如a|b的短路。 - 计算
1|(1&0),发生一次形如a|b的短路。其中1&0不再计算。 - 计算
0|1,得到最终结果 1。
因此,& 短路出现 1 次,| 短路出现 2 次。
样例 2
输入
(0|1&0|1|1|(1|1))&(0&1&(1|0)|0|1|0)&0
输出
0
2 3
样例 3
见选手目录下的 expr/expr3.in 与 expr/expr3.ans。
样例 4
见选手目录下的 expr/expr4.in 与 expr/expr4.ans。
数据范围
设 |s| 为字符串 s 的长度。
对于所有测试数据,保证:
- 1 ≤ |s| ≤ 10⁶;
- s 中仅含有字符
0、1、&、|、(、); - s 是一个符合规范的逻辑表达式;
- 输入字符串的开头、中间和结尾均无额外的空格;
- s 中没有重复的括号嵌套,即没有形如
((a))的子串,其中 a 是符合规范的逻辑表达式。
| 测试点编号 | 字符串长度 ≤ | 特殊性质 |
|---|---|---|
| 1、2 | 3 | 无 |
| 3、4 | 5 | |
| 5 | 2000 | 1 |
| 6 | 2 | |
| 7 | 3 | |
| 8~10 | 无 | |
| 11、12 | 10⁶ | 1 |
| 13、14 | 2 | |
| 15~17 | 3 | |
| 18~20 | 无 |
特殊性质 1: 保证 s 中没有字符 &。
特殊性质 2: 保证 s 中没有字符 |。
特殊性质 3: 保证 s 中没有字符 ( 和 )。
提示
以下给出一个“符合规范的逻辑表达式”的形式化定义:
- 字符串
0和1是符合规范的; - 如果字符串 s 是符合规范的,且 s 不是形如
(t)的字符串(其中 t 是符合规范的),那么字符串(s)也是符合规范的; - 如果字符串 a 和 b 均是符合规范的,那么字符串
a&b、a|b均是符合规范的; - 所有符合规范的逻辑表达式均可由以上方法生成。
相关
在以下作业中: