题解:虽然是二叉树的题,但不需要建树,找规律。把m下的二进制按照n下面的x的顺序排序,转换成十进制,就是终端一系列数的位置,根据位置输出对应值。
#include <cstdio>
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 500;
int num[10], pos;
int main() {
int n, ans[N], m, inp[10], cases = 1, outp[N];
string str;
while (scanf("%d", &n) != EOF && n) {
getchar();
getline(cin, str);
int len = str.size();
int n = 0;
for (int i = 0; i < len; i++)
if (str[i] >= '0' && str[i] <= '9')
num[n++] = str[i] - '0' - 1;
pos = 0;
int a = pow(2, n);
char c;
for (int i = 0; i < a; i++) {
scanf("%c", &c);
ans[i] = c - '0';
}
scanf("%d", &m);
printf("S-Tree #%d:\n", cases++);
getchar();
for (int j = 0; j < m; j++) {
for (int k = 0; k < n; k++) {
scanf("%c", &c);
inp[k] = c - '0';
}
getchar();
for (int q = 0, p = n - 1; q < n; q++, p--)
pos += pow(2, p) * inp[num[q]];
outp[j] = ans[pos];
pos = 0;
}
for (int j = 0; j < m; j++)
printf("%d", outp[j]);
printf("\n\n");
}
return 0;
}