此題若是分析得當會發現本質上就是一個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