10pts求助
查看原帖
10pts求助
1351155
liuzhuoran141516楼主2024/9/24 13:11
#include <bits/stdc++.h>
using namespace std;
struct fbitree {
	char fbi;
	int id, dad, left, right;
	bool o = 0;
}a[2049];
char ret(char a, char b) {
	if (a == 'F' or b == 'F') {
		return 'F';
	} else if (a == 'B') {
		if (b == 'I') {
			return 'F';
		} else {
			return 'B';
		}
	} else if (a == 'I') {
		if (b == 'B') {
			return 'F';
		} else {
			return 'I';
		}
	}
}
void out(fbitree FBI[], int first) {
	int l = FBI[first].left, r = FBI[first].right, d = FBI[first].dad;
	if (l == 0 or (FBI[l].o == 1 and FBI[r].o == 1)) {
		cout << FBI[first].fbi;
		FBI[first].o = 1;
	} else {
		out(FBI, l);
	}
	if (d == 0) {
		return;
	}
	if (FBI[d].left == first) {
		int k = FBI[d].right;
		out(FBI, k);
	} else {
		out(FBI, d);
	}
}
int n, s = 1;
int main() {
	cin >> n;
	if (n == 0) {
		char c;
		cin >> c;
		cout << c;
		return 0;
	} else if (n == 1) {
		char t, y;
		cin >> t >> y;
		if (t == '1') {
			t = 'I';
		} else {
			t = 'B';
		}
		if (y == '1') {
			y = 'I';
		} else {
			y = 'B';
		}
		cout << t << y << ret(t, y);
		return 0;
	}
	for (int i = 1; i <= 1 << n; i ++) {
		char c;
		cin >> c;
		a[i].id = i;
		if (c == '0') {
			a[i].fbi = 'B';
		} else if (c == '1') {
			a[i].fbi = 'I';
		}
	}
	int s1 = 1, s2 = 2, now = n, dadid = (1 << n) + 1;
	while (now > 1) {
		a[s1].dad = dadid;
		a[s2].dad = dadid;
		a[dadid].id = dadid;
		a[dadid].left = a[s1].id;
		a[dadid].right = a[s2].id;
		a[dadid].fbi = ret(a[s1].fbi, a[s2].fbi);
		s += 2;
		s1 += 2;
		s2 += 2;
		dadid ++;
		if (s >= 1 << now) {
			s = s % 1 << now;
			now --;
		}
	}
	out(a, 1);
	return 0;
}
2024/9/24 13:11
加载中...