#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,m,h[N],e[N],ne[N],idx,w[N];
bool st[N];
char c[N];
stack<int> stk;
inline void c_plus(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
inline void init(){
memset(h,-1,sizeof(h));
idx=0;
}
inline void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int dfs1(int u){
if (!c[u]){
return w[u];
}else if (c[u]=='!'){
w[u]=!dfs1(e[h[u]]);
}else{
int a=e[h[u]],b=e[ne[h[u]]];
if (c[u]=='&'){
w[u]=dfs1(a)&dfs1(b);
}else{
w[u]=dfs1(a)|dfs1(b);
}
}
return w[u];
}
void dfs2(int u){
st[u]=1;
if (!c[u]){
return;
}else if (c[u]=='!'){
dfs2(e[h[u]]);
}else{
int a=e[h[u]],b=e[ne[h[u]]];
if (c[u]=='&'){
if (w[a]){
dfs2(b);
}
if (w[b]){
dfs2(a);
}
}else{
if (!w[a]){
dfs2(b);
}
if (!w[b]){
dfs2(a);
}
}
}
}
int main(){
c_plus();
init();
string s;
getline(cin,s);
cin>>n;
for (int i=1;i<=n;i++){
cin>>w[i];
}
m=n;
for (int i=0;i<s.size();i++){
if (s[i]==' '){
continue;
}else if (s[i]=='x'){
int j=i+1,x=0;
while (j<s.size() && isdigit(s[j])){
x=x*10+s[j++]-'0';
}
stk.push(x);
i=j;
}else if (s[i]=='!'){
c[++m]=s[i];
add(m,stk.top());
stk.pop();
stk.push(m);
}else{
c[++m]=s[i];
add(m,stk.top());
stk.pop();
add(m,stk.top());
stk.pop();
stk.push(m);
}
}
int ans=dfs1(m);
dfs2(m);
int q,x;
cin>>q;
while (q--){
cin>>x;
if (st[x]){
cout<<(ans^1)<<endl;
}else{
cout<<ans<<endl;
}
}
return 0;
}
表达式(CSP-J2020)
最新推荐文章于 2024-09-28 15:28:59 发布