Cod sursa(job #3294168)

Utilizator EricDimiericdc EricDimi Data 17 aprilie 2025 23:08:13
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

const int MAX_LEN = 1'005;
const int SIGMA = 26;

char s[MAX_LEN];
int val[SIGMA + 1];
int p, n, q;

void Citire() {
    f.getline(s, MAX_LEN);
    n = strlen(s);
}

bool Factor();
bool Termen();
bool Evaluare();

bool Factor() {
    bool f;
    if (s[p] == '(') {
        p++; /// Trec peste '('.
        f = Evaluare();
        p++; /// Trec peste ')'.
    }
    else
    if (s[p] == 'N' && s[p + 1] == 'O' && s[p + 2] == 'T') {
        p += 4; /// Sar peste operatorul "NOT"
        f = !Factor();
    }
    else
    if (s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E') {
        p += 5; /// Sar peste "TRUE"
        f = 1;
    }
    else {
        f = val[s[p] - 'A'];
        p += 2; /// Trec peste factor.
    }
    return f;
}

bool Termen() {
    bool t = Factor();
    while (p < n && (s[p] == 'A' && s[p + 1] == 'N' && s[p + 2] == 'D')) {
        p += 4;
        t &= Factor();
    }
    return t;
}

bool Evaluare() {
    bool r = Termen();
    while (p < n && (s[p] == 'O' && s[p + 1] == 'R')) {
        p += 3;
        r |= Termen();
    }
    return r;
}

int main() {
    Citire();
    f >> q;
    while (q--) {
        char c;
        f >> c;
        val[c - 'A'] ^= 1;
        p = 0;
        g << Evaluare();
    }
    f.close();
    g.close();
    return 0;
}