A Strange Tree (S-tree) over the variable set Xn = {x1,x2,...,xn} is a binary tree representing a Boolean function f : {0,1}n → {0,1}. Each path of the S-tree begins at the root node and consists of n + 1 nodes. Each of the S-tree’s nodes has a depth, which is the amount of nodes between itself and the root (so the root has depth 0). The nodes with depth less than n are called non-terminal nodes. All non-terminal nodes have two children: the right child and the left child. Each non-terminal node is marked with some variable xi from the variable set Xn. All non-terminal nodes with the same depth are marked with the same variable, and non-terminal nodes with different depth are marked with different variables. So, there is a unique variable xi1 corresponding to the root, a unique variable xi2 corresponding to the nodes with depth 1, and so on. The sequence of the variables xi1, xi2, ..., xi**n is called the variable ordering. The nodes having depth n are called terminal nodes. They have no children and are marked with either 0 or 1. Note that the variable ordering and the distribution of 0’s and 1’s on terminal nodes are sufficient to completely describe an S-tree.

  As stated earlier, each S-tree represents a Boolean function f. If you have an S-tree and values for the variables x1, x2, ..., xn, then it is quite simple to find out what f(x1,x2,...,xn) is: start with the root. Now repeat the following: if the node you are at is labelled with a variable xi, then depending on whether the value of the variable is 1 or 0, you go its right or left child, respectively. Once you reach a terminal node, its label gives the value of the function.

Figure 1: S-trees for the function x1∧ (x2∨ x3)

  On the picture, two S-trees representing the same Boolean function, f(x1,x2,x3) = x1∧ (x2∨ x3), are shown. For the left tree, the variable ordering is x1,x2,x3, and for the right tree it is x3,x1,x2.

The values of the variables x1, x2, ..., xn, are given as a Variable Values Assignment (VVA)

(x1 = b1,x2 = b2,...,xn = bn)

  with b1,b2,...,bn ∈ {0,1}. For instance, (x1 = 1, x2 = 1, x3 = 0) would be a valid VVA for n = 3, resulting for the sample function above in the value f(1,1,0) = 1 ∧ (1 ∨ 0) = 1. The corresponding paths are shown bold in the picture.

Your task is to write a program which takes an S-tree and some VVAs and computes f(x1,x2,...,xn) as described above.

Input

  The input file contains the description of several S-trees with associated VVAs which you have to process. Each description begins with a line containing a single integer n, 1 ≤ n ≤ 7, the depth of the S-tree. This is followed by a line describing the variable ordering of the S-tree. The format of that line is xi1 xi2 ... xi**n. (There will be exactly n different space-separated strings). So, for n = 3 and the variable ordering x3, x1, x2, this line would look as follows: x3 x1 x2

  In the next line the distribution of 0’s and 1’s over the terminal nodes is given. There will be exactly 2n characters (each of which can be ‘0’ or ‘1’), followed by the new-line character. The characters are given in the order in which they appear in the S-tree, the first character corresponds to the leftmost terminal node of the S-tree, the last one to its rightmost terminal node.

The next line contains a single integer m, the number of VVAs, followed by m lines describing them. Each of the m lines contains exactly n characters (each of which can be ‘0’ or ‘1’), followed by a new-line character. Regardless of the variable ordering of the S-tree, the first character always describes the value of x1, the second character describes the value of x2, and so on. So, the line

110

 corresponds to the VVA (x1 = 1, x2 = 1, x3 = 0).

The input is terminated by a test case starting with n = 0. This test case should not be processed.

Output

  For each S-tree, output the line ‘S-Tree #j:’, where j is the number of the S-tree. Then print a line that contains the value of f(x1,x2,...,xn) for each of the given m VVAs, where f is the function defined by the S-tree.

Output a blank line after each test case.

Sample Input

3
x1 x2 x3
00000111
4
000
010
111
110
3
x3 x1 x2
00010011
4
000
010
111
110
0

Sample Output

S-Tree #1:
0011 S-Tree #2:
0011

HINT

理解这个题意需要知道以下几点:

  1. 二叉树为满二叉树,编号为k的结点必须有两个孩子,左节点的编号为2k,右节点的编号为2k+1.
  2. 每一层都对应一个变量,比如第一、二、三层对应变量分别为 x2,x1,x3。
  3. 二叉树最大右7层,利用暑促足以存储满二叉树。
  4. 计算VVA时,输入的每一个字符串都是从对应的x1,x2,x3...的顺序展开。即:第一个字符总是描述x1的值,第二个字符描述x2的值,以此类推。因此,第110行对应于VVA(x1= 1,x2= 1,x3= 0)。
  5. 输出VAA的时候要输出连个回车我,也即是没两个样例有一个空行,包括最后一行。

解决思路:

  由于每一等的变量的编号可能发生变化,因此使用输出来存储对应的变量编号,如第一层为x3,则数组x[0]=3。然后根据输入的串一直计算到叶子结点的位置,保存,输出。

Accepted

#include<bits/stdc++.h>
using namespace std; int main() {
int deep, num,sum,temp,tree=1;
string s,vva,result;
vector<int>x;
while (cin >> deep && deep) {
x.clear();result.clear();temp = 1;
sum = pow(2,deep);
for (int i = 0;i < deep;i++) {
cin >> s;
x.push_back(((int)(s.back() - '0')));
}
cin >> s >> num;
for (int i = 0;i < num;i++) {
cin >> vva;
for (int j=0;j < vva.length();j++) {
if (vva[x[j]-1] == '1')temp = 2 * temp + 1;
else if (vva[x[j]-1] == '0')temp = 2 * temp;
}
result.push_back(s[temp - sum]);temp = 1;
}
cout << "S-Tree #" << tree++ << ':' << endl << result << endl << endl;
}
}

S-Trees UVA - 712的更多相关文章

  1. UVa 712 S树

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. UVA 712 S-Trees

    二叉树? 怒水~~ 注意一下查询与x值的对应关系就好~ #include <iostream> #include <cstring> #include <cstdio&g ...

  3. BFS+数据处理 Under the Trees UVa

    题意:将多叉树转化为括号表示法,每个非叶结点的正下方都有一个'|'然后下方是一排'-'和字符,恰好覆盖所有子结点的正上方,单独的一行'#'为数据的结束标志 解题思路:用gets将字符数组输入,本题不用 ...

  4. UVa 712

    这个题根本不用建树,因为是完全二叉树,可以把这个想成二进制.对于根是二进制数的首位,之后依次类推.到最后的叶子节点就是从0到pow(2,n)-1. 关键在于在第一次输入的不是按照x1,x2,x3,x4 ...

  5. 【紫书】Undraw the Trees UVA - 10562 递归,字符串

    题意:给你画了一颗树,你要把它的前序输出. 题解:读进到二维数组.边解析边输出. 坑:少打了个-1. #define _CRT_SECURE_NO_WARNINGS #include<cstri ...

  6. 看图写树 (Undraw the Trees UVA - 10562)

    题目描述: 原题:https://vjudge.net/problem/UVA-10562 题目思路: 递归找结点 //自己的代码测试过了,一直WA,贴上紫书的代码 AC代码 #include< ...

  7. UVa 712 S-Trees(二进制转换 二叉树叶子)

    题意: 给定一颗n层的二叉树的叶子, 然后给定每层走的方向, 0代表左边, 1代表右边, 求到达的是那一个叶子. 每层有一个编号, 然后n层的编号是打乱的, 但是给的顺序是从1到n. 分析: 先用一个 ...

  8. 【习题 6-2 UVA - 712】S-Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] dfs模拟一下就好. 先预处理一个dfs. 搞出来x叶子节点它的值是什么 [代码] /* 1.Shoud it use long l ...

  9. UVA - 712 S-Trees(S树)

    题意:0往左走,1往右走,已知所有叶子的值,每个查询都是根结点到叶子结点的路径,路径的每一个点分别对应着x1,x2,x3……但是实际上的S树的路径可能并非是x1,x2,x3…… 分析:先存路径变量的顺 ...

随机推荐

  1. css中的transform,transition,translate的关系

    transform 旋转(transform是没有动画效果,你改变了它的值,元素的样子就唰的改变了.其中的位移的函数名就叫translate,所以说,translate是transform的一部分.) ...

  2. java基础第12期——反射、注解

    一. 反射 反射: 将类的各个组成部分封装为其他对象. 1.1 获取class对象的方式 Class.forName("全类名"): 将字节码文件加载进内存,返回class对象 多 ...

  3. springCloud中的服务调用feign

    springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...

  4. spring boot +dubbo 踩坑记录

    今天初次搭建spring boot +duboo的demo.记录一下踩坑记录. 首先搭建3个小demo,一个maven项目,两个spring boot (服务提供者和服务消费者)项目. 两 sprin ...

  5. 一文了解Python的迭代器的实现

    本文对迭代器的解释参考自:https://www.programiz.com/python-programming/iterator 最后自己使用迭代器实现一个公平洗牌类. 博主认为,理论来自实践,假 ...

  6. WIFI6 基本知识(一)

    什么是WI-FI6(802.11ax) Wi-Fi 6 是下一代 802.11ax 标准的简称.随着 Wi-Fi 标准的演进,WFA 为了便于 Wi-Fi 用户和设备厂商轻松了解其设备连接或支持的 W ...

  7. 微信小程序日期转时间戳

    let date = '2019-10-14'; var repTime = date.replace(/-/g, '/'); var timeTamp = Date.parse(repTime) / ...

  8. pytorch(17)学习率调整

    学习率调整 class _LRScheduler 主要属性 optimizer:关联的优化器 last_epoch:记录epoch数 bash_lrs:记录初始学习率 class _LRSchedul ...

  9. 精确率precession和召回率recall

    假设有两类样本,A类和B类,我们要衡量分类器分类A的能力. 现在将所有样本输入分类器,分类器从中返回了一堆它认为属于A类的样本. 召回率:分类器认为属于A类的样本里,真正是A类的样本数,占样本集中所有 ...

  10. Java的特性和优势以及不同版本的分类,jdk,jre,jvm的联系与区别,javadoc的生成

    Java 1.Java的特性和优势 Write Once,Run Anywhere 简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性 2.Java的三大版本 JavaSE:标 ...