15A 5T 75pts 求调
查看原帖
15A 5T 75pts 求调
906452
MARSandEARTH楼主2023/10/4 20:57
#include<bits/stdc++.h>
int n,q,x[100001],num,id,len,nx[100001];
struct Node{//表达式树
    int v,l,r,idx;
}tree[1000001];
struct Vec{
    char val;//元素
    int no;//若为值,记录在x中的位置;
};
vector<Vec> af;//后缀表达式
string s;
stack<int> st;//建树用栈
void build(){//建树
	for(int i=0;i<af.size();i++){
		if(af[i].val=='1'||af[i].val=='0'){//0 or 1
			tree[++num]=Node{af[i].val-'0',-1,-1,af[i].no};
			nx[af[i].no]=num;
			st.push(num);
		}else if(af[i].val!='!'){//& or |
			int r=st.top();st.pop();
			int l=st.top();st.pop();
			int v=(af[i].val=='&'?2:3);
			tree[++num]=Node{v,l,r,0};
			st.push(num);
		}else{// !
		    int f=st.top();st.pop();
			int v=4;
			tree[++num]=Node{v,f,-1,0};
			st.push(num);
		}
	}
}
int dfs(int u){
	if(tree[u].v==0||tree[u].v==1) return tree[u].v;//叶子结点判定
	int l=dfs(tree[u].l);//左树
	if(tree[u].v==4){//防止进入r
        return !l;
	}
	if(l==0&&tree[u].v==2){//短路
		return 0;
	}
	if(l==1&&tree[u].v==3){//短路
		return 1;
	}
	int r=dfs(tree[u].r);//右树
	return r;
}
int main(){
    getline(cin,s);
    len=s.size();
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x[i];
    }
    int nr=0;
    for(int i=0;i<len;i++){
        if(s[i]=='x'){
            nr=0;//新值
        }else if(s[i]=='&'){
            af.push_back({'&',0});//入表达式
        }else if(s[i]=='|'){
            af.push_back({'|',0});//入表达式
        }else if(s[i]=='!'){
            af.push_back({'!',0});//入表达式
        }else if(s[i]!=' '){
            nr=(nr<<1)+(nr<<3)+(s[i]^'0');
        }else{
            if(nr){
                af.push_back({(char)(x[nr]|48),nr});//插数
                nr=0;
            }
        }
    }
    build();
    cin>>q;
    while(q--){//询问
        cin>>id;
        tree[nx[id]].v^=1;//更改
        cout<<dfs(num)<<'\n';//输出
        tree[nx[id]].v^=1;//改回
    }
    return 0;
}//抄的会CE
2023/10/4 20:57
加载中...