/ WHOJ / 题库 /

[CSP-J2020] 表达式

[CSP-J2020] 表达式

题目描述

小 C 热衷于学习数理逻辑。有一天,他发现了一种特别的逻辑表达式。在这种逻辑表达式中,所有操作数都是变量,且它们的取值只能为 \(0\) 或 \(1\),运算从左往右进行。如果表达式中有括号,则先计算括号内的子表达式的值。特别的,这种表达式有且仅有以下几种运算:
1. 与运算:a & b。当且仅当 \(a\) 和 \(b\) 的值都为 \(1\) 时,该表达式的值为 \(1\)。其余情况该表达式的值为 \(0\)。
2. 或运算:a | b。当且仅当 \(a\) 和 \(b\) 的值都为 \(0\) 时,该表达式的值为 \(0\)。其余情况该表达式的值为 \(1\)。
3. 取反运算:!a。当且仅当 \(a\) 的值为 \(0\) 时,该表达式的值为 \(1\)。其余情况该表达式的值为 \(0\)。

小 C 想知道,给定一个逻辑表达式和其中每一个操作数的初始取值后,再取反某一个操作数的值时,原表达式的值为多少。

为了化简对表达式的处理,我们有如下约定:

表达式将采用 后缀表达式 的方式输入。

后缀表达式的定义如下:
\(1.\) 如果 \(E\) 是一个操作数,则 \(E\) 的后缀表达式是它本身。
\(2.\) 如果 \(E\) 是 \(E_1~\texttt{op}~E_2\) 形式的表达式,其中 \(\texttt{op}\) 是任何二元操作符,且优先级不高于 \(E_1\) 、\(E_2\) 中括号外的操作符,则 \(E\) 的后缀式为 \(E_1' E_2' \texttt{op}\),其中 \(E_1'\) 、\(E_2'\) 分别为 \(E_1\)、\(E_2\) 的后缀式。
\(3.\) 如果 \(E\) 是 \(E_1\) 形式的表达式,则 \(E_1\) 的后缀式就是 \(E\) 的后缀式。

同时为了方便,输入中:

\(1.\) 与运算符(&)、或运算符(|)、取反运算符(!)的左右 均有一个空格,但 表达式末尾没有空格
\(2.\) 操作数由小写字母 \(x\) 与一个正整数拼接而成,正整数表示这个变量的下标。例如:x10,表示下标为 \(10\) 的变量 \(x_{10}\)。数据保证 每个变量在表达式中出现恰好一次

格式

输入格式

第一行包含一个字符串 \(s\),表示上文描述的表达式。

第二行包含一个正整数 \(n\),表示表达式中变量的数量。表达式中变量的下标为 \(1,2, \cdots , n\)。

第三行包含 \(n\) 个整数,第 \(i\) 个整数表示变量 \(x_i\) 的初值。

第四行包含一个正整数 \(q\),表示询问的个数。

接下来 \(q\) 行,每行一个正整数,表示需要取反的变量的下标。注意,每一个询问的修改都是 临时的,即之前询问中的修改不会对后续的询问造成影响。

数据保证输入的表达式合法。变量的初值为 \(0\) 或 \(1\)。

输出格式

输出一共有 \(q\) 行,每行一个 \(0\) 或 \(1\),表示该询问下表达式的值。

样例1

样例输入1

x1 x2 & x3 |
3
1 0 1
3
1
2
3

样例输出1

1
1
0

样例2

样例输入2

x1 ! x2 x4 | x3 x5 ! & & ! &
5
0 1 0 1 1
3
1
3
5

样例输出2

0
1
1

样例1解释

该后缀表达式的中缀表达式形式为 \((x_1 \operatorname{and} x_2) \operatorname{or} x_3\)。

  • 对于第一次询问,将 \(x_1\) 的值取反。此时,三个操作数对应的赋值依次为 \(0\),\(0\),\(1\)。原表达式的值为 \((0\&0)|1=1\)。
  • 对于第二次询问,将 \(x_2\) 的值取反。此时,三个操作数对应的赋值依次为 \(1\),\(1\),\(1\)。原表达式的值为 \((1\&1)|1=1\)。
  • 对于第三次询问,将 \(x_3\) 的值取反。此时,三个操作数对应的赋值依次为 \(1\),\(0\),\(0\)。原表达式的值为 \((1\&0)|0=0\)。

样例2解释

  • 该表达式的中缀表达式形式为 \((\operatorname{not}x_1)\operatorname{and}(\operatorname{not}((x_2\operatorname{or}x_4)\operatorname{and}(x_3\operatorname{and}(\operatorname{not}x_5))))\)。

限制

  • 对于 \(20\%\) 的数据,表达式中有且仅有与运算(&)或者或运算(|)。
  • 对于另外 \(30\%\) 的数据,\(|s| \le 1000\),\(q \le 1000\),\(n \le 1000\)。
  • 对于另外 \(20\%\) 的数据,变量的初值全为 \(0\) 或全为 \(1\)。
  • 对于 \(100\%\) 的数据,\(1 \le |s| \le 1 \times 10^6\),\(1 \le q \le 1 \times 10^5\),\(2 \le n \le 1 \times 10^5\)。

其中,\(|s|\) 表示字符串 \(s\) 的长度。

信息

ID
1110
难度
6
分类
树结构 点击显示
标签
递交数
1
已通过
1
通过率
100%
上传者

相关

在下列训练计划中:

CSP_J历年真题