Cod sursa(job #1898831)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 2 martie 2017 12:05:04
Problema Bool Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
# include <bits/stdc++.h>

using namespace std;

const int Nmax = 1005;

int Litera[100], i, Q, n, ind;
char s[Nmax], q[105];
string sir;

void normalizare() {
    for (int i = 1; i <= n; ++i) {
        if (s[i] == 'A' && s[i + 1] == 'N') sir += '&', i += 2;
        else
        if (s[i] == 'O' && s[i + 1] == 'R') sir += '|', ++i;
        else
        if (s[i] == 'N' && s[i + 1] == 'O') sir += '!', i += 2;
        else
        if (s[i] == 'T' && s[i + 1] == 'R') sir += '1', i += 3;
        else
        if (s[i] == 'F' && s[i + 1] == 'A') sir += '0', i += 4;
        else if (isalpha(s[i]) || s[i] == '(' || s[i] == ')') sir += s[i];
    }
}

int SAU();

int NOT() {
    int nr = 0;

    if (sir[ind] == '(') ++ind, nr = SAU(), ++ind;
    else if (sir[ind] == '!') ++ind, nr = (NOT() ^ 1);
    else if (isalpha(sir[ind])) nr = Litera[sir[ind]], ++ind;
    else nr = sir[ind], ++ind;

    return nr;
}

int SI() {
    int nr = NOT();

    while (sir[ind] == '&') ++ind, nr &= NOT();

    return nr;
}

int SAU() {
    int nr = SI();

    while (sir[ind] == '|') ++ind, nr |= SI();

    return nr;
}

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

    gets(s + 1), n = strlen(s + 1);

    scanf("%d\n", &Q);

    gets(q + 1);

    sir += ' ';

    normalizare();

    cerr << sir;

    for (i = 1; i <= Q; ++i){
        ind = 1, Litera[q[i]] ^= 1;
        printf("%d", SAU());
    }

    printf("\n");

    return 0;
}