Cod sursa(job #3356025)

Utilizator rares89_Dumitriu Rares rares89_ Data 29 mai 2026 02:04:39
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<string> tokens;
int pos_tok = 0;
bool var_val[26];

bool expr();

bool factor() {
    if(tokens[pos_tok] == "(") {
        pos_tok++;
        bool res = expr();
        pos_tok++;
        return res;
    }
    if(tokens[pos_tok] == "NOT") {
        pos_tok++;
        return !factor();
    }
    if(tokens[pos_tok] == "TRUE") {
        pos_tok++;
        return true;
    }
    if(tokens[pos_tok] == "FALSE") {
        pos_tok++;
        return false;
    }
    char v = tokens[pos_tok][0];
    pos_tok++;
    return var_val[v - 'A'];
}

bool term() {
    bool res = factor();
    while(pos_tok < tokens.size() && tokens[pos_tok] == "AND") {
        pos_tok++;
        bool nxt = factor();
        res = res & nxt;
    }
    return res;
}

bool expr() {
    bool res = term();
    while(pos_tok < tokens.size() && tokens[pos_tok] == "OR") {
        pos_tok++;
        bool nxt = term();
        res = res | nxt;
    }
    return res;
}

int main() {
    string s;
    while(getline(fin, s)) {
        if(s.find_first_not_of(" \t\r\n") != string::npos) {
            break;
        }
    }
    
    int i = 0;
    while(i < s.size()) {
        if(s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') {
            i++;
            continue;
        }
        if(s[i] == '(' || s[i] == ')') {
            tokens.push_back(string(1, s[i]));
            i++;
        } else if(s[i] >= 'A' && s[i] <= 'Z') {
            string t = "";
            while(i < s.size() && s[i] >= 'A' && s[i] <= 'Z') {
                t += s[i];
                i++;
            }
            tokens.push_back(t);
        } else {
            i++;
        }
    }
    
    int n;
    fin >> n;
    string queries;
    fin >> queries;
    
    memset(var_val, 0, sizeof(var_val));
    
    for(int j = 0; j < n; ++j) {
        var_val[queries[j] - 'A'] ^= 1;
        pos_tok = 0;
        fout << expr();
    }
    fout << "\n";
    
    fin.close();
    fout.close();
    return 0;
}