25分萌新求助
查看原帖
25分萌新求助
648772
Liyuqiao11楼主2023/1/11 15:11
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,a[N],q,c,d[N],sz,zq[N];//a数组是用来存变量初始值得,d数组是用来存变量在字符串s里的下标 ,zq数组是用来存变量对应的树的节点 
string s,z;
//树 
struct T{
	int x;
	int l;
	int r;
}tree[N];
stack<int> num;
inline int numtp(){
	int t=num.top();
	num.pop();
	return t;
}
//建表达式树 
inline void buildTree(){
	int len=s.length();
	for(int i=0;i<len;i++){
		if(s[i]=='0'||s[i]=='1'){
			tree[++sz]=(T){s[i],0,0};
			num.push(sz);
			zq[i]=sz;
		}
		else if(s[i]=='&'||s[i]=='|'){
			int r=numtp(),l=numtp();
			tree[++sz]=(T){s[i],l,r};
			num.push(sz);
		}
		else if(s[i]=='!'){
			int l=numtp();
			tree[++sz]=(T){s[i],l,0};
			num.push(sz);
		}
	}
}
//计算结果 
inline int cal(int id){
	if(tree[id].l==0&&tree[id].r==0){
		return tree[id].x-'0';
	}
	char op=tree[id].x;
	int lnum=cal(tree[id].l);
	if(op=='|'){
		if(lnum==1){
			return 1;
		}
		else{
			return cal(tree[id].r);
		}
	}
	if(op=='&'){
		if(lnum==0){
			return 0;
		}
		else{
			return cal(tree[id].r);
		}
	}
	if(op=='!'){
		return !lnum;
	}
}
int main(){
	getline(cin,s);
	s.erase(remove(s.begin(),s.end(),' '),s.end());//去除空格 
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	//记录变量在字符串s中的下标并修改变量为其值,此处令s[i+1]为/是因为我不会删除s[i+1] 
	for(int i=0;i<s.size();i++){
		char f=s[i];
		if(f=='x'){
			d[s[i+1]-'0']=i;
			s[i]=char(a[s[i+1]-'0']+48);
			s[i+1]='/';
		}
	}
	//建树 
	buildTree();
	cin>>q;
	for(int i=1;i<=q;i++){
		int x;
		cin>>x;
		//取反 
		if(s[d[x]]=='1'){
			s[d[x]]='0';
		}
		else if(s[d[x]]=='0'){
			s[d[x]]='1';
		}
		tree[zq[d[x]]].x=s[d[x]];//修改树的节点 
		cout<<cal(sz)<<endl;//输出结果 
		//恢复原样 
		if(s[d[x]]=='1'){
			s[d[x]]='0';
		}
		else if(s[d[x]]=='0'){
			s[d[x]]='1';
		}
		tree[zq[d[x]]].x=s[d[x]];
	}
	return 0;
}
2023/1/11 15:11
加载中...