Cod sursa(job #2720544)

Utilizator vansJos da pa perete vans Data 10 martie 2021 22:38:29
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1004;

int n, poz;
char a[NMAX + 1], b[NMAX + 1], x;
bool vals[255];

void constr() {
    vals['0'] = 0, vals['1'] = 1;
    for(int i = 0; b[i]; ++i) {
        if(b[i] == ' ') continue;
        if(b[i + 1] && isalpha(b[i]) && isalpha(b[i + 1])) {
            if(b[i] == 'A') a[poz++] = '&', i += 3; //and
            else if(b[i] == 'O') a[poz++] = '|', i += 2; //or
            else if(b[i] == 'N') a[poz++] = '~', i += 3; //not
            else if(b[i] == 'T') a[poz++] = '1', i += 4; //true
            else if(b[i] == 'F') a[poz++] = '0', i += 5; //false
        } else a[poz++] = b[i];
    }
}

inline bool evalOr();
inline bool evalAnd();
inline bool evalNot();

inline bool eval() {
    poz = 0;
    return evalOr();
}

inline bool evalOr() {
    bool prec = evalAnd();
    while(a[poz] == '|') ++poz, prec |= evalAnd();
    return prec;
}

inline bool evalAnd() {
    bool prec = evalNot();
    while(a[poz] == '&') ++poz, prec &= evalNot();
    return prec;
}

inline bool evalNot() {
    bool nots = 0;
    while(a[poz] == '~') ++poz, nots ^= 1;
    if(a[poz] == '(') {
        ++poz;
        const bool crt = evalOr();
        ++poz;
        return crt ^ nots;
    }
    const bool crt = vals[a[poz++]];
    return crt ^ nots;
}

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    cin.getline(b, NMAX + 1), constr(), scanf(" %d", &n);
    //a[poz] = 0, cout<<a<<"\n";
    while(n--)
        scanf(" %c", &x), vals[x] ^= 1,
        printf("%d", eval());
    return 0;
}