Cod sursa(job #2643607)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 20 august 2020 16:54:45
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <bits/stdc++.h>
#define NMAX 1004
#define ll long long
using namespace std;

int n, lg;
bool val[NMAX];
char expr[NMAX],c;
vector<bool> values;
vector<pair<int, int>> sign;
int i;

void jump(int pos){
    i += pos;
    while (i < lg && expr[i] == ' ')
        i++;
}

void reduct(int priority){
    while (!sign.empty()){
        if (sign.back().second > priority){
            break;
        }
        else if (sign.back().first == 3){
            values.back() = values.back() ^ 1;
            sign.pop_back();
        }
        else if (sign.back().first == 2){
            bool val = values.back();
            values.pop_back();
            values.back() = values.back() | val;
            sign.pop_back();
        }
        else if (sign.back().first == 1){
            bool val = values.back();
            values.pop_back();
            values.back() = values.back() & val;
            sign.pop_back();
        }
        else{
            break;
        }
    }
}

bool _is(string word){
    if (i + word.size() - 1 >= lg) return false;
    for (int j=0;j<word.size();j++){
        if (expr[i + j] != word[j])
            return false;
    }
    jump(word.size());
    return true;
}

bool solve(){
    values.clear();
    sign.clear();
    i = 0;
    while (i < lg){
        if (_is("AND")){
            reduct(2);
            sign.push_back({1, 2});
            continue;
        }
        if (_is("OR")){
            reduct(3);
            sign.push_back({2, 3});
            continue;
        }
        if (_is("NOT")){
            reduct(1);
            sign.push_back({3, 1});
            continue;
        }
        if (expr[i] == '('){
            sign.push_back({4, 5});
            jump(1);
            continue;
        }
        if (expr[i] == ')'){
            reduct(4);
            assert(!sign.empty() && sign.back().first == 4);
            sign.pop_back();
            jump(1);
            continue;
        }
        if (_is("TRUE")){
            values.push_back(1);
            continue;
        }
        if (_is("FALSE")){
            values.push_back(0);
            continue;
        }

        bool crt = val[expr[i]];
        jump(1);
        values.push_back(crt);
    }
    reduct(4);
    assert(values.size() == 1);
    assert(sign.empty());
    return values[0];
}


int main(){
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    cin.getline(expr, 1006);
    lg = strlen(expr);
    cin >> n;
    for (int i=1;i<=n;i++){
        cin >> c;
        val[c] ^= 1;

        cout << (int)solve();
    }
    return 0;
}