表达式(树+栈+递归)
查看原帖
表达式(树+栈+递归)
456362
xuhanbao楼主2021/10/4 14:47

本题代码

#include<bits/stdc++.h> 
using namespace std;
const int N=1e5+7,L=1e6+7;
struct Node{
	int fa,chd[2],v,ng,u;
	char op;
	int V(){ return ng? !v : v;}
}tr[N<<1];
char s[L];
int n,c,stk[N<<1],tp;
void init(){
	for(int i=0;s[i];++i){
		if(s[i]==' ') continue;
		if(s[i]=='x') {
			int j=i+1,id=0;
			while(s[j]>='0'&&s[j]<='9')
				id=id*10+s[j++]-'0';
			stk[++tp]=id,i=j;
			continue;
		}
		if(s[i]=='!'){tr[stk[tp]].ng^=1;continue;}
		tr[++c].op=s[i];
		int rc=stk[tp--],lc=stk[tp--];
		tr[lc].fa=tr[rc].fa=c,tr[c].chd[1]=rc,tr[c].chd[0]=lc;
		if(s[i]=='&') {
			tr[c].v=tr[lc].V()&tr[rc].V();
			if(tr[c].v==0)
				tr[lc].u|=(tr[rc].V()==0),tr[rc].u|=(tr[lc].V()==0);
		}
		else {
			tr[c].v=tr[lc].V()|tr[rc].V();
			if(tr[c].v==1)
				tr[lc].u|=(tr[rc].V()==1),tr[rc].u|=(tr[lc].V()==1);
		}
		stk[++tp]=c;
	}
}
void lable(int x){
	int lc=tr[x].chd[0],rc=tr[x].chd[1];
	if(lc==0) return;
	tr[lc].u|=tr[x].u,tr[rc].u|=tr[x].u;
	lable(lc),lable(rc);
}
int main() {
	freopen("expr.in","r",stdin);
	freopen("expr.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin.getline(s,L);
	cin>>n;
	for(int i=1;i<=n;++i) cin>>tr[i].v;
	c=n;init();lable(c);//c为根节点
	int q;
	cin>>q;
	while(q--)
	{
		int x;
		cin>>x;
		cout<<(tr[x].u?tr[c].V():!tr[c].V())<<endl;
	}
    return 0;
}
2021/10/4 14:47
加载中...