逻辑表达式
逻辑表达式
题目描述
逻辑表达式是计算机科学中的重要概念和工具,包含逻辑值、逻辑运算、逻辑运算优先级等内容。
在一个逻辑表达式中,元素的值只有两种可能:0(表示假)和 1(表示真)。元素之间有多种可能的逻辑运算,本题中只需考虑如下两种:"与"(符号为 &)和"或"(符号为 |)。其运算规则如下: 0 & 0 = 0 & 1 = 1 & 0 = 0,1 & 1 = 1; 0 | 0 = 0,0 | 1 = 1 | 0 = 1 | 1 = 1。
在一个逻辑表达式中还可能有括号。规定在运算时,括号内的部分先运算;两种运算并列时,& 运算优先于 | 运算;同种运算并列时,从左向右运算。
此外,在 C++ 等语言的有些编译器中,对逻辑表达式的计算会采用一种"短路"的策略:在形如 a & b 的逻辑表达式中,会先计算 a 部分的值,如果 a = 0,那么整个逻辑表达式的值就一定为 0,故无需再计算 b 部分的值;同理,在形如 a | b 的逻辑表达式中,会先计算 a 部分的值,如果 a = 1,那么整个逻辑表达式的值就一定为 1,无需再计算 b 部分的值。
现在给你一个逻辑表达式,你需要计算出它的值,并且统计出在计算过程中,两种类型的"短路"各出现了多少次。需要注意的是,如果某处"短路"包含在更外层被"短路"的部分内则不被统计。
输入格式
输入共一行,一个非空字符串 S 表示待计算的逻辑表达式。
输出格式
输出共两行,第一行输出一个字符 0 或 1,表示这个逻辑表达式的值;第二行输出两个非负整数,分别表示计算上述逻辑表达式的过程中,形如 a & b 和 a | b 的"短路"各出现了多少次。
样例 #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
提示
设 |s| 为字符串 s 的长度。对于所有数据,1 <= |s| <= 10^6。保证 s 中仅含有字符 0、1、&、|、(、) 且是一个符合规范的逻辑表达式,没有重复的括号嵌套。
本题为 CSP-J 第二轮真题(2022 年,expr)。
在线判题使用官方样例与补充测试数据,程序输出与答案一致即判对。