Cod sursa(job #1496443)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 4 octombrie 2015 22:48:56
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <cstring>
#include <cctype>

const int LENMAX = 100010;
const int NMAX = 101;
bool val[LENMAX];
int N;

bool expresie (), factor(), termen ();
char s[NMAX];
char *poz;

void  a () {
    while (*poz == ' ') {
        poz++;
    }
}

bool NOT (char c, char v) {
    if (c == 'F' && v == 'A') {
        ++poz; ++poz; ++poz; ++poz; ++poz; a ();
        return 1;
    }
    if (c == 'T' && v == 'R') {
        ++poz; ++poz; ++poz; ++poz; a ();
        return 0;
    }
    if (val[c - 'A'] == 0) {
        ++poz; a ();
        return 1;
    }
    if (val[c - 'A'] == 1) {
        ++poz; a ();
        return 0;
    }
}

bool VAL (char c, char v) {
    if (c == 'T' && v == 'R') {
        ++poz; ++poz; ++poz; ++poz; a ();
        return 0;
    }
    if (c == 'F' && v == 'A') {
        ++poz; ++poz; ++poz; ++poz; ++poz; a ();
        return 1;
    }
    if (val[c - 'A'] == 0) {
        ++poz; a ();
        return 0;
    }
    if (val[c - 'A'] == 1) {
        ++poz; a ();
        return 1;
    }
}

bool expresie () {
    a ();
    bool ans = termen ();
    while (*poz == 'O' && *(poz + 1)== 'R') {
        ++poz; ++poz; a ();
        ans = (ans || termen ());
        a ();
    }
    return ans;
}

bool termen () {
    a ();
    bool ans = factor ();
    while (*poz == 'A' && *(poz + 1) == 'N') {
        ++poz; ++poz; ++poz; a ();
        ans = (ans && factor ());
        a ();
    }
    return ans;
}

bool factor () {
    a ();
    bool ans = 0;
    if (*poz == '(') {
        ++poz; a ();
        ans = expresie ();
        ++poz; a ();
        return ans;
    }
    if (*poz == 'N' && *(poz + 1) == 'O') {
        ++poz; ++poz; ++poz; a ();
        return NOT (*poz, *(poz + 1));
    }
    return VAL (*poz, *(poz + 1));
}

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

    gets (s);
    poz = s;

    scanf ("%d ", &N);
    char C;
    for (int i = 1; i <= N; i++) {
        scanf ("%c", &C);
        val[C - 'A'] = (val[C - 'A'] == 1)? 0:1;
        poz = s;
        int ans = expresie ();
        printf ("%d", ans);
    }
    printf ("\n");

    return 0;
}