Cod sursa(job #2545605)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 13 februarie 2020 12:26:22
Problema Bool Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.67 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() == '|') {
                        advance() ;
                        currVal |= andFactor() ;
                        advance() ;
                }
                return currVal ;
        }
        bool notFactor() {
                bool currVal ;
                if (currentChar() == '(') {
                        advance() ;
                        currVal = evaluate() ;
                        advance() ;
                } else {
                        if (currentChar() == '0') {
                                advance() ;
                                currVal = 0 ;
                        } else if (currentChar() == '1') {
                                advance() ;
                                currVal = 1 ;
                        } else if (currentChar() == '!') {
                                advance() ;
                                currVal = !notFactor() ;
                        } else {
                                currVal = upd[currentChar() - 'A'] ;
                                advance() ;
                        }
                }
                return currVal ;
        }

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

const int MV = 1e4 ;

bool isAlpha(char c) {
        return ('A' <= c && c <= 'Z') ;
}

void create(char A[], char B[], int sz) {
        int p(0) ;
        for (int i = 0 ; i < sz ; ++ i) {
                if (B[i] == '(' || B[i] == ')') {
                        A[p ++] = B[i] ;
                } else if (B[i] == 'T' && B[i + 1] == 'R') {
                        A[p ++] = '1' ;
                } else if (B[i] == 'F' && B[i + 1] == 'A') {
                        A[p ++] = '0' ;
                } else if (B[i] == 'N' && B[i + 1] == 'O') {
                        A[p ++] = '!' ;
                } else if (B[i] == 'A' && B[i + 1] == 'N') {
                        A[p ++] = '&' ;
                } else if (B[i] == 'O' && B[i + 1] == 'R') {
                        A[p ++] = '|' ;
                } else if (isAlpha(B[i]) && (!isAlpha(B[i - 1]) && !isAlpha(B[i + 1]))) {
                        A[p ++] = B[i] ;
                }
        }
        for (int i = 0 ; i < p ; ++ i) {
                std::cerr << A[i] << ' ' ;
        }
}

int main() {
        char S[MV + 5], ch ;
        char B[MV + 5] ;
        int p(0) ;
        fgets(S, MV, in) ;
        create(B, S, strlen(S)) ;
        Expresion exp(B) ;
        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()) ;
        }
}