题目大意:一堆废话。。。。。大概意思就是有一颗完全二叉树(注意:是完全二叉树,这个特点可以利用一下),然后有n层,每层的编号是xi xj xk,最后一层即叶子节点是一个01序列,然后给出m条指令,从根节点走,0往左边走,1往右边走,问你最后走到的叶子节点的值是什么?
思路:一开始我是想建树,但是实现起来太麻烦了,然后因为是一颗完全二叉树并且前n-1层并没赋值,然后用数组去维护最后一层节点的值即可,用左子树2i,右子树2i+1这个特点就行了。
代码:

#include<iostream>
using namespace std;

const int maxn=1e3+10;
char ch[maxn];
int index[maxn];
int search[maxn];
int f[maxn];
int n,t;
int main(){
	int cas=1;
	while(scanf("%d",&n)&&n){
		cout<<"S-Tree #"<<cas++<<":"<<endl;
		int id;
		for(int i=1;i<=n;i++){
			cin>>ch;
			sscanf(&ch[1],"%d",&id);
			index[i]=id;
		}
		string ch;
		cin>>ch;int cnt=1<<n;
		for(int i=0;i<ch.size();i++){
			search[cnt++]=ch[i]-'0';
		}
		scanf("%d",&t);
		while(t--){
			cin>>ch;
			for(int i=0;i<ch.size();i++){
				f[i+1]=ch[i]-'0';
			}
			int cnt=1;
			for(int i=1;i<=n;i++){
				int x=f[index[i]];
				if(x==0){
					cnt=2*cnt;
				}else{
					cnt=2*cnt+1;
				}
				if(i==n){
					cout<<search[cnt];
				}
			}
		}
		cout<<endl<<endl;
	}
}