样例未过,运行错误......
支持壶关!
#include<bits/stdc++.h>
using namespace std;
struct node {
int vl;
node *fa, *br, *l, *r;
}a[1000010], b[1000010];
string s;
stack<int> num, idd;
stack<char> op;
int n, q, x[1000010], id;
int main() {
getline(cin, s);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i];
}
string t = "";
int iid = 1;
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
if (t == "&" || t == "|" || t == "!") {
if (t == "&" && num.size() > 1) {
int num1 = num.top(); num.pop();
int num2 = num.top(); num.pop();
int id1 = idd.top(); idd.pop();
int id2 = idd.top(); idd.pop();
if (id1 == 11451400 || id2 == 11451400) continue;
a[id1].br = &a[id2];
a[id2].br = &a[id1];
a[id1].fa = a[id2].fa = &b[iid];
b[iid].l = &a[id1], b[iid].r = &a[id2];
a[id1].vl = num1, a[id2].vl = num2;
b[iid].vl = 2;
idd.push(11451400);
num.push(num1 & num2);
iid++;
}
if (t == "|" && num.size() > 1) {
int num1 = num.top(); num.pop();
int num2 = num.top(); num.pop();
int id1 = idd.top(); idd.pop();
int id2 = idd.top(); idd.pop();
if (id1 == 11451400 || id2 == 11451400) continue;
a[id1].br = &a[id2];
a[id2].br = &a[id1];
a[id1].fa = a[id2].fa = &b[iid];
b[iid].l = &a[id1], b[iid].r = &a[id2];
a[id1].vl = num1, a[id2].vl = num2;
b[iid].vl = 3;
idd.push(11451400);
num.push(num1 | num2);
iid++;
}
if (t == "!" && num.size() > 0) {
int num1 = num.top(); num.pop();
int id1 = idd.top(); idd.pop();
if (id1 == 11451400) continue;
a[id1].br = nullptr;
a[id1].fa = &b[iid];
b[iid].l = &a[id1], b[iid].r = nullptr;
a[id1].vl = num1;
b[iid].vl = 4;
idd.push(11451400);
num.push(!num1);
iid++;
}
} else {
int nu = 0;
for (int j = 1; j < t.size(); j++) {
nu = nu * 10 + (t[j] - '0');
}
idd.push(nu);
num.push(x[nu]);
}
t = "";
} else t += s[i];
}
cin >> q;
int val = num.top();
while (q--) {
cin >> id;
int vv = a[id].fa->vl;
if (vv == 2) {
if ((a[id].br->vl & (!a[id].vl)) != (a[id].br->vl & a[id].vl)) {
cout << !val << endl;
} else cout << val << endl;
} else if (vv == 3) {
if ((a[id].br->vl | (!a[id].vl)) != (a[id].br->vl | a[id].vl)) {
cout << !val << endl;
} else cout << val << endl;
} else {
cout << !val << endl;
}
}
return 0;
}
本人蒟蒻对指针不太理解,大佬不要介意哈~