悬3关,求调
查看原帖
悬3关,求调
902158
aaalys楼主2023/10/17 14:15
#include <iostream>
using namespace std;

struct node
{
    bool is_not = true;
    string data;
    int lch , rch;
    void init(bool b , string s , int l , int r) 
    {
        is_not = b;
        data = s;
        lch = l;
        rch = r;
    }
}a[1000010];
bool num[1000010] , is[1000010];
int cnt , top;
int st[1000010];
int to_num(string s)
{
    int ans = 0;
    for (int i = 1; i < s.size(); i ++)ans = ans * 10 + s[i] - '0';
    return ans;
}
void build()
{
    string s , t;
    getline(cin , t);
    for (int i = 0; i < t.size(); i ++)
    {
        if ((t[i] != ' ' || t[i-1] == ' '))
        {
            s += t[i];
            if (i != t.size() - 1)continue;
        }
        if (s == "!")a[cnt].is_not ^= 1; 
        else 
        {
            if (s.size() == 1)a[++cnt].init(false , s , st[top--] , st[top--]);
            else a[++cnt].init(false , s , -1 , -1);
            st[++top] = cnt;
        }
        s = "";
    }
}
bool ans(int id)
{
    if (id == -1)return 0;
    if (a[id].is_not)
    {
        a[id].is_not ^= 1;
        bool res = ans(id);
        a[id].is_not ^= 1;
        return !res;
    }
    if ((a[id].data).size() == 1)
    {
        if (a[id].data == "&")return ans(a[id].lch) & ans(a[id].rch);
        else return ans(a[id].lch) | ans(a[id].rch);
    }
    else return num[to_num(a[id].data)];
}
void get(int id)
{
    string s = a[id].data;
    if (s.size() != 1)
    {
        is[to_num(s)] = true;
        return;
    }
    if (s == "|")
    {
        bool lans = ans(a[id].lch) , rans = ans(a[id].rch);
        if (lans && rans)return;
        if (!rans)get(a[id].lch);
        if (!lans)get(a[id].rch);
    }
    if (s == "&")
    {
        bool lans = ans(a[id].lch) , rans = ans(a[id].rch);
        if (!lans && !rans)return;
        if (rans)get(a[id].lch);
        if (lans)get(a[id].rch);
    }
}
int main()
{
    build();
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++)cin >> num[i];
    int q;
    cin >> q;
    bool ttt = ans(cnt);
    get(cnt);
    while (q --)
    {
        int x;
        cin >> x;
        if (is[x])cout << !ttt;
        else cout << ttt;
        cout << endl;
    }
    return 0;
}

评测记录

2023/10/17 14:15
加载中...