Cod sursa(job #2350450)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 21 februarie 2019 12:54:24
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 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(){
    int rez = termen();
    while(ex[p] == '|'){
        p++;
        rez = (rez || termen());
    }
    return rez;
}

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

bool factor(){
    bool semn = true, val = 0;
    while(ex[p] == '!'){
        semn = (!semn);
        p++;
    }
    if(ex[p] == '('){
        p++;
        val = expresie();
        p++;
        if(semn)
            return val;
        return !val;
    }
    if(isalpha(ex[p]))
        val = logic[ex[p] - 'A' + 1];
    if(isdigit(ex[p]))
        val = bool(ex[p] - '0');
    p++;
    if(!semn)
        val = !val;
    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();
        n--;
    }
    return 0;
}