Cod sursa(job #3337617)

Utilizator StefanIancuTempStefan Iancu StefanIancuTemp Data 29 ianuarie 2026 10:24:58
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <fstream>
#include <cmath>
#include <string>
#include <map>
#include <sstream>
#include <vector>
#include <iostream>

using namespace std;

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

const int N = 1e5;
string input;
int p;
map<char, bool> predef;

int expresie();
int factor();
int termen();

bool contains(char c) {
    return predef.find(c) != predef.end();
}

int expresie()
{
    bool exp_or = termen();
    while (input[p] == '|')
    {
        p++;
        exp_or = (termen() || exp_or);
    }
    return exp_or;
}

int termen()
{
    bool exp_and = factor();
    while (input[p] == '&')
    {
        p++;
        exp_and = (factor() && exp_and);
    }
    return exp_and;
}

int factor() {
    long long val = 0;
    bool invers = false;
    if (input[p] == '!') {
        p++;
        invers = !invers;
    }
    if (input[p] == '(')
    {
        p++;
        val = expresie();
        p++;
        if (invers)
            return !val;
        return val;
    }
    while (input[p] == '0' || input[p] == '1')
    {
        val = (input[p] - '0');
        p++;
    }
    while (input[p] >= 'A' && input[p] <= 'Z') {
        if (contains(input[p])) {
            val = predef[input[p]];
        }
        else {
            val = false;
        }
        p++;
    }
    if (invers)
        return !val;
    return val;
}
string parse() {
    string output = "";
    string input;
    string original;
    getline(fin, original);
    stringstream stream(original);
    vector<string> v;
    while (getline(stream, input, ' ')) {
        v.push_back(input);
    }
    for (int i = 0; i < v.size(); i++) {
        if (v[i] == "AND") {
            output += '&';
        }
        else if (v[i] == "OR") {
            output += '|';
        }
        else if (v[i] == "NOT") {
            output += '!';
        }
        else if (v[i] == "TRUE") {
            output += '1';
        }
        else if (v[i] == "FALSE") {
            output += '0';
        }
        else if (v[i][0] == '(') {
            string add = "";
            int j = 0;
            while (v[i][j] == '(') {
                add += '(';
                j++;
            }
          
            if (v[i][j] == 'T' && v[i][j+1] == 'R') {
                add += '1';
                j += 4;
            }else if (v[i][j] == 'F' && v[i][j+1] == 'A') {
                add += '0';
                j += 4;
            }
            else {
                add += v[i][j];
                j++;
            }
            while (v[i][j] == ')') {
                add += ')';
                j++;
            }
            output += add;
        }
        else {
            output += v[i];
        }
    }
    return output;
}

int main()
{
    input = parse();
    cout << input;
    int q;
    fin >> q;
    for (int i = 0; i < q; i++) {
        p = 0;
        char c;
        fin >> c;
        if (contains(c)) {
            predef[c] = !predef[c];
        }
        else {
            predef.insert(make_pair(c, true));
        }
        fout << expresie();
    }
    p = 0;
    
    return 0;

}