0pts求助
查看原帖
0pts求助
1049950
cqj857699楼主2024/10/23 13:54
#include<bits/stdc++.h> 
using namespace std;
const int N=1e6+10;
stack<int> s;
string a,b;
bool flg[N];
vector<int> tree[N];
int v[N],n,m,q;
char p[N];
void dfs(int x)
{
	flg[x] = true;
	if(x <= n)
	{
		return;
	}
	if(p[x] == '!')
	{
		dfs(tree[x][0]);
	}
	else
	{
		int lc = tree[x].front();
		int rc = tree[x].back();
		if(p[x] == '&')
		{
			if(v[lc] == 1)
			{
				dfs(rc);
			}
			if(v[rc] == 1)
			{
				dfs(lc);
			}
		}
		else if(p[x] == '|')
		{
			if(v[lc] == 0)
			{
				dfs(rc);
			}
			if(v[rc] == 0)
			{
				dfs(lc);
			}
		}
	}
}
int main()
{
	getline(cin,a);
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
	{
		scanf(" %d",&v[i]);
	}
	int len=a.size();
	m=n;
	for(int i = 0;i < len;i++)
	{
		if(isdigit(a[i]))
		{
			b+=a[i];
			if(i==len-1 || !isdigit(a[i+1]))
			{
				int tmp=stoi(b);
				s.push(tmp);
				b = "";
			}
			else if(a[i] == '!')
			{
				p[++m] = a[i];
				int c = s.top();
				s.pop();
				v[m] = !v[c];
				s.push(m);
				tree[m].push_back(c); 
			} 
			else if(a[i] == '&' || a[i] == '|')
			{
				p[++m] = a[i];
				int lc = s.top();
				s.pop();
				int rc = s.top();
				s.pop();
				if(a[i] == '&')
				{
					v[m] = v[lc] & v[rc];
				}
				else
				{
					v[m] = v[lc] | v[rc];
				}
				s.push(m);
				tree[m].push_back(lc);
				tree[m].push_back(rc);
			}
		}
	} 
	int ans = v[s.top()];
	dfs(s.top());
	scanf("%d",&q);
	while(q--)
	{
		int tmp;
		scanf("%d",&tmp);		
		if(flg[tmp] == true)
		{
			printf("%d\n", !ans);
		}
		else
		{
			printf("%d\n",ans);
		}
	}
	return 0;
}

本人太弱了,查不出一点问题

2024/10/23 13:54
加载中...