考虑每个子数有没有效,无效时dfs序mark一下
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
int n;
char ch[5];
vector<int> e[1000005];
int ans[1000005];
int cnt;
int getk(char c)
{
if(c=='A')
return 1;
if(c=='O')
return 2;
if(c=='X')
return 3;
if(c=='N')
return 4;
if(c=='I')
return 5;
}
struct node
{
int cate,val,imp;
int ansid;
}itm[1000005];
int sta[1000005],ed[1000005];
int tab[1000005];
int tid;
void dfs(int u)
{
tid++;
sta[u]=tid;
int cate=itm[u].cate;
if(cate==1)
{
int v1=e[u][0];
int v2=e[u][1];
dfs(v1),dfs(v2);
itm[u].val=itm[v1].val & itm[v2].val;
ed[u]=tid;
if(itm[v1].val==0)
tab[sta[v2]]+=1,tab[ed[v2]+1]-=1;
if(itm[v2].val==0)
tab[sta[v1]]+=1,tab[ed[v1]+1]-=1;
}
else if(cate==2)
{
int v1=e[u][0];
int v2=e[u][1];
dfs(v1),dfs(v2);
itm[u].val=itm[v1].val | itm[v2].val;
ed[u]=tid;
if(itm[v1].val==1)
tab[sta[v2]]+=1,tab[ed[v2]+1]-=1;
if(itm[v2].val==1)
tab[sta[v1]]+=1,tab[ed[v1]+1]-=1;
}
else if(cate==3)
{
int v1=e[u][0];
int v2=e[u][1];
dfs(v1),dfs(v2);
itm[u].val=itm[v1].val ^ itm[v2].val;
ed[u]=tid;
}
else if(cate==4)
{
int v1=e[u][0];
dfs(v1);
itm[u].val=(itm[v1].val)^1;
ed[u]=tid;
} else
ed[u]=tid;
}
int main() {
while(~scanf("%d",&n))
{
cnt=0;
tid=0;
for(int i=0;i<=1000000;i++)
e[i].clear(),tab[i]=0;
for(int i=1;i<=n;i++)
{
scanf("%s",ch);
int cate=getk(ch[0]);
itm[i].cate=cate; itm[i].imp=1;
if(cate==5)
itm[i].ansid=cnt,cnt++;
if(cate<=3)
{
int u,v;
scanf("%d%d",&u,&v);
e[i].push_back(u);
e[i].push_back(v);
} else if(cate==4)
{
int u;
scanf("%d",&u);
e[i].push_back(u);
} else
{
int u;
scanf("%d",&u);
itm[i].val=u;
}
}
dfs(1);
int pre=0;
for(int i=1;i<=tid;i++)
{
pre+=tab[i];
if(pre>0)
tab[i]=1;
else
tab[i]=0;
}
int tval=itm[1].val;
for(int i=1;i<=n;i++)
{
if(itm[i].cate==5)
{
int id=sta[i];
if(tab[id]==1)
{
ans[itm[i].ansid]=tval;
}
else
{
ans[itm[i].ansid]=tval^1;
}
}
}
for(int i=0;i<cnt;i++)
{
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}