Cod sursa(job #2358235)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 27 februarie 2019 22:37:57
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;

string s, ex;
int p;
bool logic[30];
bool expresie();
bool termen();
bool factor();

void precalc(){
    for(int i = 0; i < int(s.size()); ++i){
        if((isalpha(s[i]) && !isalpha(s[i - 1]) && !isalpha(s[i + 1])) || s[i] == '(' || s[i] == ')')
            ex += s[i];
        else{
            if(s[i] == 'O' && s[i + 1] == 'R') ex += '|';
            else if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D') ex += '&';
            else if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T') ex += '!';
            else if(s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E') ex += '1';
            else if(s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E') ex += '0';
        }
    }
}

bool expresie(){
    bool rez = termen();
    while(ex[p] == '|'){
        p++;
        rez = rez | termen();
    }
    return rez;
}

bool termen(){
    bool rez = factor();
    while(ex[p] == '&'){
        p++;
        rez = rez & factor();
    }
    return rez;
}

bool factor(){
    bool val = 0;
    if(ex[p] == '('){
        p++;
        val = expresie();
        p++;
    }
    else if(ex[p] == '!'){
        p++;
        val = 1 - factor();
    }
    else if(isdigit(ex[p])){
        val = ex[p] - '0';
        p++;
    }
    else{
        val = logic[ex[p] - 'A' + 1];
        p++;
    }
    return val;
}

int main()
{
    ifstream fin("bool.in");
    ofstream fout("bool.out");
    getline(fin, s);
    precalc();
    int n;
    fin >> n;
    while(n > 0){
        char c;
        fin >> c;
        logic[c - 'A' + 1] = !logic[c - 'A' + 1];
        fout << expresie();
        p = 0;
        n--;
    }
    return 0;
}