Cod sursa(job #3192687)

Utilizator ioanabaduIoana Badu ioanabadu Data 13 ianuarie 2024 10:17:43
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <iostream>
#include <fstream>
#include <map>
#include <cstring>
#define S_MAX 1005

using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
// initial sunt toate false;

char s[S_MAX];
char final[S_MAX];
map <char, bool> valLetter;
int n, pos;

bool isLetter (char x){
    return x >= 'A' && x <= 'Z';
}

bool singleLetter (int i){
    return (isLetter(s[i+1]) == false || s[i+1] == '\0') && (isLetter(s[i-1]) == false|| i == 1);
}

void makeItSimple (){
    int idx = 0;
    for (int i=0; i<strlen(s); ++i){
        if (isLetter(s[i]) == true && singleLetter(i) == true){
            final[idx++] = s[i];
            valLetter[s[i]] = false;
        }
        else if (s[i] == '('){
            final[idx++] = '(';
        }
        else if (s[i] == ')'){
            final[idx++] = ')';
        }
        else if (isLetter(s[i])){
            if (s[i] == 'A' && s[i+1] == 'N')
                final[idx++] = '&';
            else if (s[i] == 'O' && s[i+1] == 'R')
                final[idx++] = '|';
            else if (s[i] == 'N' && s[i+1] == 'O')
                final[idx++] = '!';
            else if (s[i] == 'F' && s[i+1] == 'A')
                final[idx++] = '0';
            else if (s[i] == 'T' && s[i+1] == 'R')
                final[idx++] = '1';
        }
    }
    idx--;

    for (int i=0; i<=idx; ++i){
        cout << final[i];
    }
}

bool orEx();
bool andEx();
bool notEx();
bool fact();

int main (){
    in.getline(s, S_MAX);
    makeItSimple();
    in >> n;

    char x;
    for (int i=1; i<=n; ++i){
        in >> x;

        valLetter[x] = !valLetter[x];

        out << orEx();
    }
    return 0;
}

bool orEx (){
    bool res = andEx();
    while (final[pos] == '|'){
        pos++;
        res = res || andEx();
    }
    return res;
}

bool andEx (){
    bool res = notEx();
    while (final[pos] == '&'){
        pos++;
        res = res && notEx();
    }
    return res;
}

bool notEx(){
    bool res = fact();
    while (final[pos] == '!'){
        res = !fact();
    }
    return res;
}

bool fact(){
    bool res= false;
    while (final[pos] == '('){
        pos++;
        orEx();
        pos++;
    }
    if (final[pos] == '1')
        res = true;
    else if (final[pos] == '0')
        res = false;
    else if (isLetter(final[pos]))
        res = valLetter[final[pos]];
    return res;
}