Cod sursa(job #2871670)

Utilizator WilIiamperWilliam Damian Balint WilIiamper Data 15 martie 2022 13:39:56
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <fstream>

using namespace std;

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

enum { LP = 2, RP = 3, AND = 4, OR = 5, NOT = 6 };

char exp[ 1005 ]; int expLen;
bool val[26];

int st[ 1005 ], sp;
//int pd;

void evaluate () {
    while ( st[ sp-1 ] == NOT ) {
        st[ sp-1 ] = !st[sp];
        sp--;
    }

    if ( st[sp-1] == AND ) {
        st[ sp-2 ] = st[sp] & st[sp-2];
        sp -= 2;
    } else if ( st[sp-1] == OR ) {
        st[ sp-2 ] = st[sp] | st[sp-2];
        sp -= 2;
    }
}

void push ( int x ) {
    st[ ++sp ] = x;

    if ( st[sp] < 2 )
        evaluate();

    if ( st[sp] == RP ) {
        st[ sp-2 ] = st[sp-1];
        sp -= 2;
        evaluate();
    }
}

bool isOR ( int i ) {
    if ( i > expLen-1 )
        return false;
    if ( exp[i] == 'O' && exp[i+1] == 'R' )
        return true;
    return false;
}

bool isNOT ( int i ) {
    if ( i > expLen-2 )
        return false;

    if ( exp[i] == 'N' && exp[i+1] == 'O' && exp[i+2] == 'T' )
        return true;
    return false;
}

bool isAnd ( int i ) {
    if ( i > expLen-2 )
        return false;

    if ( exp[i] == 'A' && exp[i+1] == 'N' && exp[i+2] == 'D' )
        return true;
    return false;
}

bool isFALSE ( int i ) {
    if ( i > expLen-4 )
        return false;

    if ( exp[i] == 'F' && exp[i+1] == 'A' && exp[i+2] == 'L'
        && exp[i+3] == 'S' && exp[i+4] == 'E' )
            return true;
    return false;
}

bool isTRUE ( int i ) {
    if ( i > expLen-3 )
        return false;

    if ( exp[i] == 'T' && exp[i+1] == 'R' && exp[i+2] == 'U'
        && exp[i+3] == 'E' )
            return true;
    return false;
}

void parseExp() {
    /*for ( int i = 1; i <= expLen; i++ )
        fout << exp[i];
    fout << "\n";*/

    for ( int i = 1; i <= expLen; ) {
        if ( isAnd(i) ) {
            push( AND );
            i += 3;
        } else if ( isOR(i) ) {
            push( OR );
            i += 2;
        } else if ( isNOT(i) ) {
            push( NOT );
            i += 3;
        } else if ( isFALSE(i) ) {
            push( 0 );
            i += 5;
        } else if ( isTRUE(i) ) {
            push( 1 );
            i += 4;
        } else {
            if ( exp[i] == '(' )
                push( LP );
            else if ( exp[i] == ')' )
                push( RP );
            else
                push( val[exp[i] - 'A'] );
            i++;
        }
    }
}

int main () {
    char in[1005];
    fin.getline( in, 1000 );

    for ( int i = 0; in[i] != '\0'; i++ ) {
        if ( in[i] != ' ' )
            exp[ ++expLen ] = in[i];
    }

    int q;
    fin >> q;

    char x;
    while ( q-- ) {
        fin >> x;
        val[ x-'A' ] = !val[ x-'A' ];

        sp = 0;
        parseExp();
        fout << st[1];
    }
    return 0;
}