可以用线段树来写,注意打印时是后序遍历:先左递归,后右递归,最后输出中间即可。 代码如下:

#include <bits/stdc++.h>
using namespace std;

#define MAXN 1025
char arr[MAXN];
char FBI[MAXN << 2];
string s;
void up(int i){
    int l = i << 1, r = i << 1 | 1;
    if(FBI[l] == FBI[r]){
        FBI[i] = FBI[l];
    }else{
        FBI[i] = 'F';
    }
}
void build(int l, int r, int i){
    if(l == r){
        FBI[i] = s[l] == '1' ? 'I' : 'B';
    }else{
        int mid = (l + r) >> 1;
        build(l, mid, i << 1);
        build(mid + 1, r, i << 1 | 1);
        up(i);
    }
}
void print(int l, int r, int i){
    if(l == r){
        printf("%c",FBI[i]);
    }else{
        int mid = (l + r) >> 1;
        print(l, mid, i << 1);
        print(mid + 1, r, i << 1 | 1);
        printf("%c",FBI[i]);
    }
}
int main(){
	int n;
    scanf("%d", &n);
    n = (1 << n);
    cin >> s;
    s = " " + s;
    build(1, n, 1);
    print(1, n, 1);
	return 0;
}