用奇怪的并查集的方式做的
每进行一次运算就用并查集合并
#include<bits/stdc++.h>
#define ll int
using namespace std;
struct re{
ll l, r, o;
};
vector<re> work;
ll num[3000000][100], p = 0;
string s, t;
ll find(ll x){
if (x != num[x][0]) num[x][0] = find(num[x][0]);
return num[x][0];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
getline(cin,s);
string h;
s += " ";
ll u = 0, b = 0;
for (int i = 0; i <= s.size(); i ++) num[i][0] = i;
for (int i = 0; i <= s.size(); i ++){
if (s[i] == ' '){
if (h == "true"){
p ++;
num[p][1] = 1;
if (u == 1) b = 1;
u = 1;
}else if (h == "false"){
p ++;
num[p][1] = 0;
if (u == 1) b = 1;
u = 1;
}else if (h == "and"){
work.push_back((re){p, p + 1, 1});
if (u == 0) b = 1;
u = 0;
}else if (h == "or"){
work.push_back((re){p, p + 1, 2});
if (u == 0) b = 1;
u = 0;
}else {
work.push_back((re){p + 1, p + 1, 0});
u = 0;
}
t = h;
h = "";
}else {
h += s[i];
}
}
if (b){ cout << "error"; return 0;}
for (int k = 0; k < work.size(); k ++){
if (work[k].o == 0){
if (num[find(work[k].l)][1] == 1)
num[find(work[k].l)][1] = 0;
else num[find(work[k].l)][1] = 1;
}
}
for (int k = 0; k < work.size(); k ++){
if (work[k].o == 1){
if (num[find(work[k].l)][1] == 1 && num[find(work[k].r)][1] == 1){
num[find(work[k].l)][1] = 1;
num[find(work[k].r)][1] = 1;
num[find(work[k].l)][0] = find(num[work[k].r][0]);
}else {
num[find(work[k].l)][1] = 0;
num[find(work[k].r)][1] = 0;
num[find(work[k].l)][0] = find(num[work[k].r][0]);
}
}
}
ll j;
for (int k = 0; k < work.size(); k ++){
if (work[k].o == 2){
if (num[find(work[k].l)][1] == 1 && num[find(work[k].r)][1] == 1 || num[find(work[k].l)][1] == 0 && num[find(work[k].r)][1] == 1 || num[find(work[k].l)][1] == 1 && num[find(work[k].r)][1] == 0){
num[find(work[k].l)][1] = 1;
num[find(work[k].r)][1] = 1;
num[find(work[k].l)][0] = find(num[work[k].r][0]);
}else {
num[find(work[k].l)][1] = 0;
num[find(work[k].r)][1] = 0;
num[find(work[k].l)][0] = find(num[work[k].r][0]);
}
j = work[k].l;
}
}
if (num[find(1)][1] == 1) cout << "true";
else cout << "false";
return 0;
}