Cod sursa(job #3337632)

Utilizator Vlad10Vlad Negut Vlad10 Data 29 ianuarie 2026 10:50:08
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

string line0;
char line[1001];
int f[30][1001];  // f[var][0] = număr apariții, f[var][1..] = poziții în line[]
int p;

bool expresie();
bool AndFunction();
bool factor();

bool expresie() {
    bool sum = AndFunction();
    while (line[p] == '|') {
        p++;
        sum = sum || AndFunction();
    }
    return sum;
}

bool AndFunction() {
    bool sum = factor();
    while (line[p] == '&') {
        p++;
        sum = sum && factor();
    }
    return sum;
}

bool factor() {
    int negatii = 0;
    while (line[p] == '!') {
        negatii++;
        p++;
    }

    bool val;
    if (line[p] == '(') {
        p++;
        val = expresie();
        if (line[p] == ')') p++;  // consumăm ) dacă există (mai sigur)
    } else if (line[p] == '1') {
        val = true;
        p++;
    } else if (line[p] == '0') {
        val = false;
        p++;
    } else {
        // eroare? dar pentru robustețe returnăm false
        p++;
        val = false;
    }

    if (negatii % 2 == 1) val = !val;
    return val;
}

int main() {
    getline(fin, line0);

    int i = 0;
    p = 0;
    int n = line0.size();

    while (i < n) {
        if (line0[i] == ' ') {  // eliminăm spațiile
            i++;
            continue;
        }
        if (i + 2 < n && line0[i] == 'A' && line0[i+1] == 'N' && line0[i+2] == 'D') {
            line[p++] = '&';
            i += 3;
        }
        else if (i + 1 < n && line0[i] == 'O' && line0[i+1] == 'R') {
            line[p++] = '|';
            i += 2;
        }
        else if (i + 2 < n && line0[i] == 'N' && line0[i+1] == 'O' && line0[i+2] == 'T') {
            line[p++] = '!';
            i += 3;
        }
        else if (i + 3 < n && line0[i] == 'T' && line0[i+1] == 'R' &&
                 line0[i+2] == 'U' && line0[i+3] == 'E') {
            line[p++] = '1';
            i += 4;
        }
        else if (i + 4 < n && line0[i] == 'F' && line0[i+1] == 'A' &&
                 line0[i+2] == 'L' && line0[i+3] == 'S' && line0[i+4] == 'E') {
            line[p++] = '0';
            i += 5;
        }
        else if (line0[i] >= 'A' && line0[i] <= 'Z') {
            int idx = line0[i] - 'A';
            f[idx][0]++;
            f[idx][f[idx][0]] = p;
            line[p++] = '0';  // inițial false
            i++;
        }
        else if (line0[i] == '(' || line0[i] == ')') {
            line[p++] = line0[i];
            i++;
        }
        else {
            i++;  // ignorăm caractere necunoscute (dar nu ar trebui să existe)
        }
    }

    line[p] = '\0';  // terminăm șirul (bun pentru siguranță)

    int k;
    fin >> k;

    string mods;
    getline(fin, mods);       // consumă restul liniei după k
    getline(fin, mods);       // citim linia cu literele (A B C ...)

    for (char ch : mods) {
        if (ch < 'A' || ch > 'Z') continue;

        int idx = ch - 'A';
        for (int j = 1; j <= f[idx][0]; j++) {
            int poz = f[idx][j];
            line[poz] = (line[poz] == '0') ? '1' : '0';
        }

        p = 0;
        fout << (expresie() ? '1' : '0');
    }

    fout << endl;
    return 0;
}