#P13681. [IAMOI R2] 逻辑推理
[IAMOI R2] 逻辑推理
题目背景
小 A 最近迷上了逻辑推理,所以小 B 给他出了一道题。
题目描述
小 B 的题目可以抽象成下面的形式。
题目一共有 个逻辑变量 , 个推理规则,以及 个询问。
其中,推理规则均形如 ,且 。
满足下面的限制:
-
用后缀表达式给出,而且各个子串用空格隔开。
-
是一个合法的表达式。
比如说,A1 A2 & A3 |
就是一个合法的 。
同时,定义 为 中字符串的个数。
定义一次推理:若当前的 能使 为真,得出 。
接下来有 次互相独立的询问。每次询问给定推理的初始条件,即若干个 满足 。问最少需要几次推理才可以推出 。如果无解,请输出 -1
。
对题目部分内容的解释:
:逻辑变量:指只有真值或假值的变量,你可以认为 C++ 中的 bool
是一种逻辑变量。
:合法的表达式:
-
单个变量是合法的表达式(在输入中形如 ,如 、)。
-
若 与 都是合法的表达式,则 与 都是合法的表达式。
:怎样的 才能使 为真?
-
将 中的 替换成 的真假值。需要注意的是,这样并不会真正修改 。比方说,
A1 A2 | A3 &
在 的时候 就会被替换成true false | true &
。 -
将替换过后的 进行表达式计算,其中:
-
|
表示逻辑或、&
表示逻辑与。 -
将原来的表达式按照后缀表达式计算。
- 最后的结果( 或者 )就代表了当前的 能否满足 。
输入格式
本题有多组测试数据。
输入的第一行包含一个整数 ,表示测试数据的组数。
接下来包含 组数据,每组数据的格式如下:
接下来 行为 个推理规则:
-
第 行包含两个数 。
-
第 行包含 个字符串,表示 。
接下来 行为 次询问,每次询问给定一个字符串 和一个整数 。其中 表示需要推出的条件, 且:
-
如果 ,那么 。
-
如果 ,那么 。
输出格式
对于每组测试数据输出 行,每行包含一个整数,表示询问的答案。
2
4 4 3
7 4
A1 A2 | A2 A3 | &
5 2
A1 A3 A4 & |
5 1
A2 A3 & A4 |
1 1
A1
1010 4
1101 2
1000 4
3 0 2
100 1
100 2
1
0
2
0
-1
提示
【样例解释】
对于第 个询问,直接运用第一个推理规则即可。
对于第 个询问,按顺序运用第 和第 个推理规则即可。
【数据范围】
本题采用捆绑测试。
记 表示单个测试点中 的和。
分值 | |||||
---|---|---|---|---|---|
对于所有的测试数据,保证:,,,。
【提示】
本题输入量较大,请使用较快的输入方式。