此题若是分析得当会发现本质上就是一个C语言的二-十进制转换。因为输入的S树的叶子节点是在xi已经排好序的基础上输入的,因此在解题时并不要考虑xi的顺序。c++
1 #include <bits/stdc++.h>
2
3 using namespace std; 4
5 /**************** 6 UVa712 S树 7 ***************/
8
9 int main() 10 { 11 //deep:树的深度
12 int deep = 0; 13 cin >> deep; 14 //STree:存储叶子的数组 pow(2, deep)是叶子的个数
15 int max = pow(2, deep); 16 int STree[max]; 17 memset(STree, -1, sizeof(STree)); 18 for(int i = 0; i < max; i++){ 19 cin >> STree[i]; 20 } 21
22 //num:表达式的个数
23 int tmp = 0, num = 0; 24 cin >> num; 25 //存储xi的值
26 vector<int> v; 27 //存储答案
28 vector<int> ans; 29 int res = 0, h = 0; 30 while(num--){ 31 int k = 0; 32 v.clear(); 33 //输入表达式
34 for(int i = 0; i < deep; i++){ 35 cin >> tmp; 36 v.push_back(tmp); 37 } 38 res = 0; 39 //将查询式转变为十进制值
40 while(!v.empty()){ 41 int ch = v.back(); 42 v.pop_back(); 43 res += ch*pow(2, (k++)); 44 } 45 ans.push_back(res); 46 } 47 for(int i = 0; i < ans.size(); i++){ 48 cout << STree[ans[i]]; 49 } 50 cout << endl; 51 return 0; 52 }
输出结果:数组
3
0 0 0 0 0 1 1 1
4
0 0 0
0 1 0
1 1 1
1 1 0
0011