#C1012. [CSP-J 2020T3] 表达式

    ID: 4486 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: 2 上传者: 标签>CSP-J入门级2020年表达式求值后缀表达式模拟下标计数

[CSP-J 2020T3] 表达式

[CSP-J 2020] 表达式

题目描述

小 C 热衷于学习数理逻辑。有一天,他发现了一种特别的逻辑表达式。在这种逻辑表达式中,所有操作数都是变量,且它们的取值只能为 0011。表达式使用后缀表达式给出,运算从左到右按后缀规则进行。

本题中只有以下三种运算:

  1. 与运算 a & b:当且仅当 aabb 的值都为 11 时结果为 11,否则为 00
  2. 或运算 a | b:当且仅当 aabb 的值都为 00 时结果为 00,否则为 11
  3. 取反运算 !a:当 aa 的值为 00 时结果为 11,否则为 00

给定一个逻辑表达式和其中每个变量的初值。之后有若干次询问,每次临时取反某一个变量的值,要求输出该次询问下原表达式的值。每次询问之间互不影响。

为便于处理,表达式采用后缀表达式输入。操作数由小写字母 x 与一个正整数拼接而成,例如 x10 表示变量 x10x_{10}。数据保证每个变量在表达式中恰好出现一次。

输入格式

第一行一个字符串 ss,表示后缀逻辑表达式。

第二行一个正整数 nn,表示变量数量。表达式中变量下标为 1,2,,n1,2,\ldots,n

第三行 nn 个整数,第 ii 个整数表示变量 xix_i 的初值。

第四行一个正整数 qq,表示询问数量。

接下来 qq 行,每行一个正整数,表示需要临时取反的变量下标。

输出格式

输出 qq 行,每行一个 0011,表示对应询问下表达式的值。

样例 #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 的中缀形式为 (x1andx2)orx3(x_1 \operatorname{and} x_2) \operatorname{or} x_3

  • 取反 x1x_1 后,三个操作数依次为 0,0,10,0,1,表达式值为 (0&0)1=1(0\&0)|1=1
  • 取反 x2x_2 后,三个操作数依次为 1,1,11,1,1,表达式值为 (1&1)1=1(1\&1)|1=1
  • 取反 x3x_3 后,三个操作数依次为 1,0,01,0,0,表达式值为 (1&0)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%20\% 的数据,表达式中只有与运算或只有或运算。
  • 对于另外 30%30\% 的数据,s1000|s| \le 1000q1000q \le 1000n1000n \le 1000
  • 对于另外 20%20\% 的数据,所有变量的初值全为 00 或全为 11
  • 对于 100%100\% 的数据,1s1061 \le |s| \le 10^61q1051 \le q \le 10^52n1052 \le n \le 10^5

其中 s|s| 表示字符串 ss 的长度。