[2004年NOIP普及组] FBI树 先建树,再输出

分析:可以从头建立一个先序树,再根据后序输出

算法:后序是左右跟的顺序输出,而最下面的左儿子则是输入的总数,左儿子的数值一定是奇数,当到右儿子时则是偶数,可以先判断是否是右儿子,再通过除以二的父节点(若也是右儿子会继续执行)

#include<bits/stdc++.h>
using namespace std;
int s=1,sss,bs,ss,i,j,ij,bj;
int n,b[20000],bb[20000];
void fl(int l){
if(l>sss) return;
if(bb[l]==1) cout<<"I";
else if(bb[l]==0) cout<<"B";
else cout<<"F";
if(l==1) return;
if(l%2==1) fl(l/2);
if(l>=s) fl(l+1);
}
int main(){
char a;
cin>>n;
for(i=1;i<=n;i++){
s=s*2;
}
for(i=1;i<=s;i++){
cin>>a;
b[i]=a-'0';
}
sss=0;
for(i=1;i<=n+1;i++){
bj=1;
for(j=2;j<=i;j++){
bj=bj*2;
}
int bjj=s/bj;
for(j=1;j<=bj;j++){
sss++;
bs=b[bjj*(j-1)+1];
for(ij=bjj*(j-1)+1;ij<=bjj*j;ij++){
if(bs!=b[ij]){
bs=2;
break;
}
}
bb[sss]=bs;
}
}
fl(s);
}

posted @ 2022-08-15 15:44  TheMagician  阅读(31)  评论(0)    收藏  举报