Cod sursa(job #2545584)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 13 februarie 2020 12:06:54
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.24 kb
#include <bits/stdc++.h>

FILE *in = fopen("bool.in", "r"), *out = fopen("bool.out", "w") ;

int upd[30] ;

class Expresion {
private :
        char *exp ;
        int point ;
        char currentChar() {
                while (exp[point] == ' ') {
                        advance() ;
                }
                return exp[point] ;
        }
        void advance() {
                point ++ ;
        }


public :
        __attribute__ ( (always_inline)) Expresion(char S[]) {
                exp = S ;
                point = 0 ;
        }

        void reset(int pos) {
                this ->point = pos ;
        }

        bool evaluate() {
                bool currVal = andFactor() ;
                while (currentChar() == 'O') {
                        advance() ;
                        advance() ;
                        currVal |= andFactor() ;
                        advance() ;
                }
                return currVal ;
        }
        bool notFactor() {
                bool currVal ;
                if (currentChar() == '(') {
                        advance() ;
                        currVal = evaluate() ;
                        advance() ;
                } else {
                        if (currentChar() == 'F' && exp[point + 1] == 'A') {
                                advance() ;
                                advance() ;
                                advance() ;
                                advance() ;
                                advance() ;
                                currVal = 0 ;
                        } else if (currentChar() == 'T' && exp[point + 1] == 'R') {
                                advance() ;
                                advance() ;
                                advance() ;
                                advance() ;
                                currVal = 1 ;
                        } else if (currentChar() == 'N' && exp[point + 1] == 'O') {
                                advance() ;
                                advance() ;
                                advance() ;
                                currVal = !notFactor() ;
                        } else {
                                currVal = upd[currentChar() - 'A'] ;
                                advance() ;
                        }
                }
                return currVal ;
        }

        bool andFactor() {
                bool currVal = notFactor() ;
                while (currentChar() == 'A') {
                        advance() ;
                        advance() ;
                        advance() ;
                        currVal &= notFactor() ;
                        advance() ;
                }
                return currVal ;
        }
};

const int MV = 1e4 ;

int main() {
        char S[MV + 5], ch ;
        int p(0) ;
        for (ch = fgetc(in) ; ch != '\n' ; ch = fgetc(in)) {
                S[p ++] = ch ;
        }
        Expresion exp(S) ;
        int q ;
        fscanf(in, "%d\n", &q) ;
        for (int i = 1 ; i <= q ; ++ i) {
                ch = fgetc(in) ;
                upd[ch - 'A'] ^= 1 ;
                exp.reset(0) ;
                fprintf(out, "%d", exp.evaluate()) ;
        }
}