15pts求助qwq
查看原帖
15pts求助qwq
1044533
mbz12345楼主2025/8/3 23:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 100010
int cnt,a[N],n,m;
bool vis[N];
char c[N];
string s;
int h[N];
stack<int> sta;
struct node{
	int nex;
	int to;
}g[2*N];
void add(int u,int v){
	cnt++;
	g[cnt].nex=h[u];
	h[u]=cnt;
	g[cnt].to=v;
}
void build(){
    int f=0;
	for(int i=0;i<s.size();i++){
		if(s[i]<='9'&&s[i]>='0'){
			f=f*10+(s[i]-'0');
			if(s[i+1]>'9'||s[i+1]<'0'){
				sta.push(f);
				f=0;
			}
		}
		else if(s[i]=='!'){
			int l=sta.top();
		    sta.pop();
			int wy=a[l];
			m++;
			c[m]=s[i];
			add(m,l);
			sta.push(m);
			a[m]=!wy;
		}
		else if(s[i]=='&'||s[i]=='|'){
			m++;
			c[m]=s[i];
			int u=sta.top();sta.pop();
			int y=sta.top();sta.pop();
			int p=a[u],q=a[y];
			add(m,u);add(m,y);
			sta.push(m);
			int l;
			if(s[i]=='&'){
				l=p&q;
			}
			else{
				l=p|q;
			}
			a[m]=l;
		}
	}
	return ;
}
void dfs(int x){
	vis[x]=1;
	if(x<=n) return ;
	if(c[x]=='!'){
		int l=g[h[x]].to;
		dfs(l);
	}
	else if(c[x]=='&'){
		int l=g[h[x]].to,r=g[g[h[x]].nex].to;
		if(a[l]==0) dfs(l);
		else if(a[r]==0) dfs(r);
	}
	else if(c[x]=='|'){
		int l=g[h[x]].to,r=g[g[h[x]].nex].to;
		if(a[l]==1) dfs(l);
		else if(a[r]==1) dfs(r);
	}
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
getline(cin,s);
cin>>n;
m=n;
for(int i=1;i<=n;i++){
	cin>>a[i];
}
build(); 
int ans=a[m];
dfs(m);
int q;
cin>>q;	
for(int i=1;i<=q;i++){
	int qw;
	cin>>qw;
	if(vis[qw]==1) cout<<!ans<<'\n';
	else cout<<ans<<'\n';
}

return 0;
}
2025/8/3 23:30
加载中...