#include<bits/stdc++.h>
using namespace std;
char a[1000010];
int ul[1000010],num[1000010];
bool fAKe[1000010],vis[1000010];
int n,m;
int cnt,ct;
int head[1000010];
struct emm{
int t,nxt;
}l[2000010];
void add(int a,int b){
l[++ct].nxt=head[a];
l[ct].t=b;
head[a]=ct;
return;
}
int stn[1000010],tpn;
int re,su,su0;
void dfs(int u){
vis[u]=1;
for(int i=head[u];i;i=l[i].nxt){
int t=l[i].t;
if(vis[t]) continue;
else dfs(t);
}
}
int main(void){
gets(a+1);
int len=strlen(a+1);
for(int i=1;i<=len;i++){
if(a[i]=='!') ul[++cnt]=-3;
else if(a[i]=='|') ul[++cnt]=-2;
else if(a[i]=='&') ul[++cnt]=-1;
else if(a[i]==' ') continue;
else if(a[i]=='x'){
cnt++;
int x=0;
++i;
while(a[i]!=' '){
x=x*10+(a[i]-'0');
++i;
}
num[x]=cnt;
}
}
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
ul[num[i]]=m;
}
for(int i=1;i<=cnt;i++){
if(ul[i]>=0){
stn[++tpn]=i;
continue;
}
if(ul[i]==-3){
ul[stn[tpn]]+=1;
ul[stn[tpn]]%=2;
}else if(ul[i]==-2){
tpn--;
if(ul[stn[tpn]]==ul[stn[tpn+1]]&&ul[stn[tpn+1]]==1)fAKe[stn[tpn]]=1;
if(ul[stn[tpn]]==0&&ul[stn[tpn+1]]==0&&!fAKe[stn[tpn+1]]) add(stn[tpn],stn[tpn+1]);
else if(ul[stn[tpn]]==0) swap(stn[tpn],stn[tpn+1]);
}else if(ul[i]==-1){
tpn--;
if(ul[stn[tpn]]==0&&ul[stn[tpn+1]]==0) fAKe[stn[tpn]]=1;
if(ul[stn[tpn]]==1&&ul[stn[tpn+1]]==1&&!fAKe[stn[tpn+1]]) add(stn[tpn],stn[tpn+1]);
else if(ul[stn[tpn]]==1) swap(stn[tpn],stn[tpn+1]);
}
}
re=stn[tpn];
su=ul[re];
su0=(su+1)%2;
if(!fAKe[re]) dfs(re);
scanf("%d",&m);
int x;
for(int i=1;i<=m;i++){
scanf("%d",&x);
// printf("-->%d\n",num[x]);
if(vis[num[x]]&&!fAKe[num[x]]){
printf("%d\n",su0);
}else printf("%d\n",su);
}
return 0;
}
第六个点和第十四个点被Wonderful Answer了,但是并没有找到任何bug,也没有发现任何可以将代码证伪的反例。。。
求奆老 Hack || 帮查下bug。。。