#P1105. S-Trees
S-Trees
描述
在变量集合 上的一棵奇特树(S 树)是一棵表示布尔函数 的二叉树。S 树的每条路径都从根节点开始,由 个节点组成。S 树的每个节点都有一个深度,深度是指该节点与根节点之间的节点数量(所以根节点的深度为 0)。深度小于 的节点被称为非终端节点。所有非终端节点都有两个子节点:右子节点和左子节点。每个非终端节点都用变量集合 中的某个变量 进行标记。所有深度相同的非终端节点都用同一个变量标记,而深度不同的非终端节点则用不同的变量标记。因此,存在一个与根节点对应的唯一变量 ,一个与深度为 1 的节点对应的唯一变量 ,以此类推。变量 的序列被称为变量排序。深度为 的节点被称为终端节点。它们没有子节点,并且标记为 0 或 1。请注意,变量排序以及终端节点上 0 和 1 的分布足以完整地描述一棵 S 树。
如前所述,每棵 S 树都表示一个布尔函数 。如果你有一棵 S 树以及变量 的值,那么找出 的值是相当简单的:从根节点开始。然后重复以下操作:如果你所在的节点标记有变量 ,那么根据该变量的值是 1 还是 0,你分别走向它的右子节点或左子节点。一旦你到达一个终端节点,其标记值就是函数的值。

在图中,展示了两棵表示相同布尔函数 $f(x_1, x_2, x_3) = x_1 \text{ 且 } (x_2 \text{ 或 } x_3)$ 的 S 树。对于左边的树,变量排序是 ,而对于右边的树,变量排序是 。
变量 的值由一个变量值赋值(VVA)给出:
你的任务是编写一个程序,该程序接受一棵 S 树和一些 VVA,并按照上述描述计算 的值。
输入
输入包含几棵 S 树及其相关 VVA 的描述,你需要对这些内容进行处理。每个描述都以包含单个整数 ()的一行开始, 是 S 树的深度。接下来一行描述 S 树的变量排序。该行的格式为 。(将恰好有 个不同的以空格分隔的字符串)。因此,对于 且变量排序为 的情况,这一行将如下所示:
在下一行中,给出终端节点上 0 和 1 的分布。将恰好有 个字符(每个字符可以是 0 或 1),后面跟着换行符。这些字符按照它们在 S 树中出现的顺序给出,第一个字符对应 S 树最左边的终端节点,最后一个字符对应最右边的终端节点。
接下来一行包含单个整数 ,即 VVA 的数量,后面跟着 行对它们的描述。这 行中的每一行都恰好包含 个字符(每个字符可以是 0 或 1),后面跟着换行符。无论 S 树的变量排序如何,第一个字符始终描述 的值,第二个字符描述 的值,以此类推。因此,这一行: 对应 VVA 。
输入以一个 开头的测试用例结束。这个测试用例不应被处理。
输出
对于每棵 S 树,输出一行 “S-Tree #j:”,其中 是 S 树的编号。然后打印一行,其中包含对于给定的 个 VVA 中每个 VVA 的 的值,其中 是由 S 树定义的函数。
在每个测试用例之后输出一个空行。
输入示例
3
x1 x2 x3
00000111
4
000
010
111
110
3
x3 x1 x2
00010011
4
000
010
111
110
0
输出示例
S-Tree #1:
0011
S-Tree #2:
0011
来源
1999 年中欧中部地区竞赛