Cod sursa(job #3294169)

Utilizator EricDimiericdc EricDimi Data 17 aprilie 2025 23:11:56
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 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];
bool val[SIGMA + 1];
int p, n, q;

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

int Factor();
int Termen();
int Evaluare();

int Factor() {
    int 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
    if (s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E') {
        p += 6;
        f = 0;
    }
    else {
        f = val[s[p] - 'A'];
        p += 2; /// Trec peste factor.
    }
    return f;
}

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

int 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;
}