Cod sursa(job #3192704)

Utilizator ioanabaduIoana Badu ioanabadu Data 13 ianuarie 2024 10:35:48
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 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, i = 0;
    while (i<strlen(s)){
        if (isLetter(s[i]) == true && singleLetter(i) == true){
            final[idx++] = s[i];
            valLetter[s[i]] = false;
            i+=2;
        }
        else if (s[i] == '('){
            final[idx++] = '(';
            i++;
        }
        else if (s[i] == ')'){
            final[idx++] = ')';
            i++;
        }
        else if (isLetter(s[i])){
            if (s[i] == 'A' && s[i+1] == 'N'){
                final[idx++] = '&';
                i+=4;
            }
            else if (s[i] == 'O' && s[i+1] == 'R'){
                final[idx++] = '|';
                i+=3;
            }
            else if (s[i] == 'N' && s[i+1] == 'O'){
                final[idx++] = '!';
                i+=4;
            }
            else if (s[i] == 'F' && s[i+1] == 'A'){
                final[idx++] = '0';
                i+=6;
            }
            else if (s[i] == 'T' && s[i+1] == 'R'){
                final[idx++] = '1';
                i+=5;
            }
        }
        else
            ++i; // pentru spatiu gen
    }
    idx--;
}

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];
        cout << 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]) == true)
        res = valLetter[final[pos]];
    return res;
}