Cod sursa(job #3302266)

Utilizator prodsevenStefan Albu prodseven Data 5 iulie 2025 15:29:02
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <string>

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)) {
        cout << "[OR found at pos " << p << "]\n";
        p += 4;
        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 += 5;
        rez = rez && factor(s, p);
    }
    return rez;
}

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

int main() {
    getline(cin, s);
    int n, p = 0;
    cin >> n;
    char schimbari[101];
    cin >> schimbari;
    for (int i = 0 ; i < n ; ++i) {
        vars[schimbari[i] - 'A'] = !vars[schimbari[i] - 'A'];
        p = 0;
        cout << "A=" << vars['A' - 'A'] << " → result=" << expresie(s, p) << '\n';
    }
    return 0;
}