线段树

不懂的可以看线段树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;
}