Cod sursa(job #3302276)

Utilizator prodsevenStefan Albu prodseven Data 5 iulie 2025 15:59:44
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("bool.in");
ofstream cout("bool.out");

string s;
vector<bool> vars(27, false);

bool expresie(string &s, int &p);
bool termen(string &s, int &p);
bool factor(string &s, int &p);
bool var(string &s, int &p);

bool s2_in_s1_at_poz(string s2, string s1, int poz) {
    if (poz + s2.size() > s1.size()) return false;
    for (int i = 0 ; i < s2.size() ; ++i) {
        if (s1[i + poz] != s2[i]) return false;
    }
    return true;
}

bool expresie(string &s, int &p) {
    bool rez = termen(s, p);
    while (p < s.size() && s2_in_s1_at_poz("OR", s, p)) {
        p += 2;
        rez = rez || termen(s, p);
    }
    return rez;
}

bool termen(string &s, int &p) {
    bool rez = factor(s, p);
    while (p < s.size() && s2_in_s1_at_poz("AND", s, p)) {
        // cout << "[AND found at pos " << p << "]\n";
        p += 3;
        rez = rez && factor(s, p);
    }
    return rez;
}

bool factor(string &s, int &p) {
    if (s2_in_s1_at_poz("NOT", s, p)) {
        p += 3;
        return !expresie(s, p);
    }
    if (s2_in_s1_at_poz("TRUE", s, p)) {
        p += 4;
        return true;
    }
    if (s2_in_s1_at_poz("FALSE", s, p)) {
        p += 5;
        return false;
    }
    if (s[p] == '(') {
        ++p;
        bool rez = expresie(s, p);
        ++p;
        return rez;
    }
    if (s[p] >= 'A' && s[p] <= 'Z') {
        ++p;
        return vars[s[p - 1] - 'A'];
    }
    return false;
}

int main() {
    getline(cin, s);
    s.erase(remove(s.begin(), s.end(), ' '), s.end());
    // cout << s << "\n\n";
    int n;
    cin >> n;
    char schimbari[101];
    cin >> schimbari;
    for (int i = 0 ; i < n ; ++i) {
        vars[schimbari[i] - 'A'] = !vars[schimbari[i] - 'A'];
        int p = 0;
        // cout << "A=" << vars['A' - 'A'] << " → result=" << expresie(s, p) << '\n';
        // if (p != s.size()) {
        //     cout << "Warning: parser stopped at " << p << " / " << s.size() << endl;
        // }
        cout << expresie(s, p);
    }
    return 0;
}