Help,回赠关注
查看原帖
Help,回赠关注
461366
封禁用户楼主2022/7/20 15:46
#include <bits/stdc++.h>
using namespace std;

const int MAXS = 1000010;
const int MAXN = 100010;
char s[MAXN], subs[MAXS];
int n, x[MAXN], rt, op[MAXN], l[MAXN], r[MAXN], f[MAXN];
stack<int> stk;

int mark(int now) {
	if (op[now] < 0) {
		return x[-op[now]];
	}
	if (op[now] == 2) {
		return 1 - mark(l[now]);
	}
	int a = mark(l[now]);
	int b = mark(r[now]);
	if (op[now] == 0) {
		if (a == 0) f[r[now]] = 1;
		if (b == 0) f[l[now]] = 1;
		return a & b;
	}
	if (op[now] == 1) {
		if (a == 1) f[r[now]] = 1;
		if (b == 1) f[l[now]] = 1;
		return a | b;
	}
}

void markall(int now) {
	if (op[now] < 0) return;
	if (f[now]) {
		f[l[now]] = 1;
		if (op[now] != 2) f[r[now]] = 1;
	}
	markall(l[now]); 
	if (op[now] != 2) markall(r[now]);
}

int main() {
	fgets(s, MAXS, stdin);
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x[i]);
	}
	char *bgn = s;
	while (sscanf(bgn, "%s", subs) != EOF) {
		int len = strlen(subs);
		bgn += len + 1;
		rt++;
		if (subs[0] == 'x') {
			int value = 0;
			for (int j = 1; j < len; j++) {
				value = value * 10 + subs[j] - '0';
			}
			op[rt] = -value;
		} else {
			int lc, rc;
			lc = stk.top(); stk.pop();
			if (subs[0] != '!') {
				rc = stk.top(); stk.pop();
				swap(lc, rc);
			}
			if (subs[0] == '&') {
				op[rt] = 0;
				l[rt] = lc;
				r[rt] = rc;
			}
			if (subs[0] == '|') {
				op[rt] = 1;
				l[rt] = lc;
				r[rt] = rc;
			}
			if (subs[0] == '!') {
				op[rt] = 2;
				l[rt] = lc;
			}
		}
		stk.push(rt);
	}
	int ans = mark(rt);
	markall(rt);
	int q;
	scanf("%d", &q);
	while (q--) {
		int a;
		scanf("%d", &a);
		printf("%d\n", (f[a] ? ans : !ans));
	}
	return 0;
}
2022/7/20 15:46
加载中...