Cod sursa(job #2810636)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 29 noiembrie 2021 21:13:35
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 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 + 1] == '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;
}