各位大佬,这题我是真的不会调了,请各位大佬看一下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int n,m,q,x,id,a[200006],c[200006],b[200006],bb[200006],son[200006][3];
inline void build();//构造一棵树
inline void dfs1(int now);//标记
inline void dfs(int now);//搜树
inline int sum(int now);//求值
signed main() {
getline(cin,s);
m=s.size();
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
c[i]=a[i];
}
build();
for(int i=0; i<=200000; i++) {
bb[i]=1;
}
int ans=sum(id);
a[id]=ans;
dfs(id);
cin>>q;
while(q--) {
cin>>x;
if(bb[x]) {
cout<<(!ans)<<endl;
} else {
cout<<ans<<endl;
}
}
}
inline int sum(int now) {
if(b[now]==-1) {
a[son[now][0]]=sum(son[now][0]);
a[son[now][1]]=sum(son[now][1]);
return (a[son[now][0]]&a[son[now][1]]);
}
if(b[now]==-2) {
a[son[now][0]]=sum(son[now][0]);
a[son[now][1]]=sum(son[now][1]);
return (a[son[now][0]]|a[son[now][1]]);
}
if(b[now]==-3) {
a[son[now][0]]=sum(son[now][0]);
return (!a[son[now][0]]);
}
if(b[now]==0&&now<=n) {
return a[now];
}
}
inline void dfs1(int now) {
if(now==0) {
return;
}
bb[now]=0;
dfs1(son[now][0]);
dfs1(son[now][1]);
}
inline void dfs(int now) {
if(now==0) {
return;
}
if(b[now]==-1) {
if(a[son[now][0]]==0) {
dfs1(son[now][1]);
}
if(a[son[now][1]]==0) {
dfs1(son[now][0]);
} else {
dfs(son[now][0]);
dfs(son[now][1]);
}
} else if(b[now]==-2) {
if(a[son[now][0]]==1) {
dfs1(son[now][1]);
}
if(a[son[now][1]]==1) {
dfs1(son[now][0]);
} else {
dfs(son[now][0]);
dfs(son[now][1]);
}
} else {
dfs(son[now][0]);
}
}
inline void build() {
id=n;
stack<int>st;
for(int i=0; i<m; i++) {
if(s[i]=='&') {
int y=st.top();
st.pop();
int z=st.top();
st.pop();
st.push(++id);
son[id][0]=y;
son[id][1]=z;
b[id]=-1;
} else if(s[i]=='|') {
int y=st.top();
st.pop();
int z=st.top();
st.pop();
st.push(++id);
son[id][0]=y;
son[id][1]=z;
b[id]=-2;
} else if(s[i]=='x') {
int y=0;
i++;
while(s[i]>='0'&&s[i]<='9') {
y=y*10+s[i]-'0';
i++;
}
st.push(y);
} else if(s[i]=='!') {
int y=st.top();
st.pop();
st.push(++id);
son[id][0]=y;
son[id][1]=-1;
b[id]=-3;
}
}
}