Cod sursa(job #1877998)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 13 februarie 2017 20:25:02
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include <cstdio>
#include <cstring>

using namespace std;

char expr[10005], s[10005];
int v[30];
int pointer;
char curchar;

void readnextchar();
int OR();
int AND();
int NOT();
int VAR();

int main() {
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);

    gets(expr);

    int n, poz;
    poz = 0;
    n = strlen(expr);

    for(int i = 0; i < n; ++ i) {
        if(expr[i] == '(' || expr[i] == ')') {
            s[poz++] = expr[i];
        } else if( 'A' <= expr[i] && expr[i] <= 'Z' ) {
            s[poz++] = expr[i];
            if(i >= 2) {
                if( ( expr[i - 2] == 'N' && expr[i] == 'T' ) || ( expr[i - 2] == 'A' && expr[i] == 'D' ) ) {
                    for(int j = 1; j <= 3; ++ j) {
                        -- poz;
                        s[poz] = NULL;
                    }
                    if(expr[i] == 'T')
                        s[poz++] = '*';
                    else
                        s[poz++] = '+';
                }
            }
            if(i >= 1) {
                if( expr[i - 1] == 'O' && expr[i] == 'R' ) {
                    for(int j = 1; j <= 2; ++ j) {
                        -- poz;
                        s[poz] = NULL;
                    }
                    s[poz++] = '-';
                }
            }
            if(i >= 3) {
                if( expr[i - 3] == 'T' && expr[i] == 'E' ) {
                    for(int j = 1; j <= 4; ++ j) {
                        -- poz;
                        s[poz] = NULL;
                    }
                    s[poz++] = '1';
                }
            }
            if(i >= 4) {
                if( expr[i - 4] == 'F' && expr[i] == 'E' ) {
                    for(int j = 1; j <= 5; ++ j) {
                        -- poz;
                        s[poz] = NULL;
                    }
                    s[poz++] = '0';
                }
            }
        }
    }

    scanf("%d\n", &n);
    gets(expr);

    for(int i = 0; i < n; ++ i) {
        pointer = 0;
        readnextchar();
        v[expr[i] - 'A'] = 1 - v[expr[i] - 'A'];
        printf("%d", OR());
    }

    return 0;
}

void readnextchar() {
    curchar = s[pointer++];
}

int OR() {
    int val = AND();
    if(curchar == '-') {
        readnextchar();
        return val | OR();
    } else {
        return val;
    }
}

int AND() {
    int val = NOT();
    if(curchar == '+') {
        readnextchar();
        return val & AND();
    } else {
        return val;
    }
}

int NOT() {
    int rez;
    if(curchar == '*') {
        readnextchar();
        rez = 1 - NOT();
    } else {
        rez = VAR();
    }
    return rez;
}

int VAR() {
    int rez;
    if( 'A' <= curchar && curchar <= 'Z' ) {
        rez = v[curchar - 'A'];
        readnextchar();
    } else if(curchar == '(') {
        readnextchar();
        rez = OR();
        readnextchar();
    } else {
        rez = curchar - '0';
    }
    return rez;
}