45pts求Hack
查看原帖
45pts求Hack
175456
Licykoc楼主2020/11/10 22:26
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e6+5;
string s;
int q[MAXN],tr[MAXN],a[MAXN],b[MAXN],flag[MAXN],c[MAXN],le[MAXN],ri[MAXN],f[MAXN];
//1:number  2:and  3:or  4:not
int n,T,x,top=0,tot=0;
void dfs (int k){
    if (flag[k]==1) {f[c[k]]=1;return;}
    if (flag[k]==2){
        if (tr[le[k]]+tr[ri[k]]==2) dfs(le[k]),dfs(ri[k]);
            else if (tr[le[k]]) dfs(ri[k]); else if (tr[ri[k]]) dfs(le[k]);
        return;
    }
    if (flag[k]==3){ 
        if (tr[le[k]]+tr[ri[k]]==0) dfs(le[k]),dfs(ri[k]);
            else if (!tr[le[k]]) dfs(ri[k]); else if (!tr[ri[k]]) dfs(le[k]);
        return;
    }
    dfs(le[k]);
}
int main(){
    //freopen("expr.in","r",stdin);
    //freopen("expr.out","w",stdout);
    getline(cin,s);
    scanf("%d",&n);
    for (int i=1;i<=n;++i) scanf("%d",&a[i]);
    for (int i=0;i<s.length();++i) if (s[i]!=' ') {
        if (s[i]=='x') {
            int num=0; 
            while (isdigit(s[++i])) num=num*10+(s[i]^48);
            b[++top]=a[num]; 
            tr[++tot]=a[num]; flag[tot]=1; c[tot]=num;
            q[top]=tot;
            continue;
        }
        if (s[i]=='&'){
            b[--top]=b[top]&b[top+1]; 
            tr[++tot]=b[top]; flag[tot]=2; le[tot]=q[top]; ri[tot]=q[top+1];
            q[top]=tot;
            continue;
        }
        if (s[i]=='|'){   
            b[--top]=b[top]|b[top+1];
            tr[++tot]=b[top]; flag[tot]=3; le[tot]=q[top]; ri[tot]=q[top+1];
            q[top]=tot;
            continue;
        }
        if (s[i]=='!'){
            b[top]=b[top]^1; 
            tr[++tot]=b[top]; flag[tot]=4; le[tot]=q[top];
            q[top]=tot;
        }
    }
    int ans=tr[tot];
    //for (int i=1;i<=tot;++i) printf("Tree %d : %d     %d   L son : %d    R son : %d\n",i,tr[i],flag[i],flag[i]>1?le[i]:-1,flag[i]>1&&flag[i]!=4?ri[i]:-1);
    dfs(tot);
    scanf("%d",&T);
    while (T--){
        scanf("%d",&x);
        if (!f[x]) printf("%d\n",ans); else printf("%d\n",ans^1);
    }
}
2020/11/10 22:26
加载中...