Cod sursa(job #2810628)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 29 noiembrie 2021 20:58:42
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

bool H[26];

char s[1001];

bool e_AND(int &p);
bool e_OR(int &p);


void rem_space(int &p) {
    while(s[p] == ' ')
        p++;
}

bool termen(int &p) {
    rem_space(p);

    bool ans = 0;

    if(s[p] == '(') {
        p++, ans = e_AND(p), p++;

        rem_space(p);
        return ans;
    }

    if(s[p] == 'N' && s[p + 1] == 'O' && s[p + 2] == 'T') {
        p += 3, ans = !e_AND(p);
        rem_space(p);

        return ans;
    }

    if(s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E') {
        p += 4, ans = 1;
        rem_space(p);

        return ans;
    }

    if(s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E') {
        p += 5;
        rem_space(p);

        return ans;
    }

    ans = H[s[p] - 'A'];
    rem_space(p);

    return ans;
}

bool e_OR(int &p) {
    rem_space(p);

    bool res = termen(p);
    while(s[p] == 'O' && s[p] == 'R') {
        p += 2;
        res |= termen(p);
    }

    rem_space(p);
    return res;
}

bool e_AND(int &p) {
    rem_space(p);

    bool res = e_OR(p);
    while(s[p] == 'A' && s[p + 1] == 'N' && s[p + 2] == 'D') {
        p += 3;
        res &= e_OR(p);
    }

    rem_space(p);
    return res;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    Open("bool");

    cin.getline(s, sizeof(s));

    int N; cin >> N;
    for(int i = 1;i <= N;i++) {
        char ch; cin >> ch;

        H[ch - 'A'] ^= 1;

        int p = 0;
        cout << e_AND(p);
    }

    return 0;
}