线段树
不懂的可以看线段树1 这里直接使用build函数
using namespace std;int n;
const int N=1027;
char tree[N<<2];
int a[N];
void pushup(int q){
if(tree[q<<1]!=tree[q<<1|1]){
tree[q]='F';
return ;
}
if(tree[q<<1]=='F'||tree[q<<1]=='F') tree[q]='F';
else if(tree[q<<1]=='I') tree[q]='I';
else tree[q]='B';
}
void build(int q,int le,int ri){
if(le==ri){
if(a[le]==0) tree[q]='B';
else tree[q]='I';
return ;
}
int mid=le+ri>>1;
build(q<<1,le,mid);
build(q<<1|1,mid+1,ri);
pushup(q);
}
void init(){
cin>>n;n=1<<n;//cout<<n<<"\n";
string s;cin>>s;
for(int i=1;i<=n;i++){
a[i]=s[i-1]-'0';
}
//for(int i=1;i<=n;i++) cout<<a[i]<<" ";
//cout<<endl;
}
void suf(int q){
if(tree[q<<1]) suf(q<<1);
if(tree[q<<1|1]) suf(q<<1|1);
cout<<tree[q];//<<q<<" ";
}
int main(){
init();
build(1,1,n);
suf(1);
return 0;
}