Cod sursa(job #3294167)

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

using namespace std;

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

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

char s[MAX_LEN + 1];
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() {
    int f;
    if (s[p] == '(') {
        p++; /// Trec peste '('.
        f = Evaluare();
        p++; /// Trec peste ')'.
    }
    else
    if (s[p] == 'N' && s[p + 1] == 'O') {
        p += 4; /// Sar peste operatorul "NOT"
        f = ~Factor();
    }
    else
    if (s[p] == 'T' && s[p + 1] == 'R') {
        p += 5; /// Sar peste "TRUE"
        f = 1;
    }
    else {
        f = val[s[p] - 'A'];
        p += 2; /// Trec peste factor.
    }
    return f;
}

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

bool Evaluare() {
    int 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;
}