Cod sursa(job #1880703)

Utilizator giotoPopescu Ioan gioto Data 15 februarie 2017 21:17:18
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
using namespace std;

int i, n, f[1005];
char c, s[1005];
inline bool eval();
inline bool op();
int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    fgets(s, 1001, stdin);
    scanf("%d\n", &n);
    for(int j = 1; j <= n ; ++j){
        scanf("%c", &c);
        f[c] = 1 - f[c];
        i = 0;
        printf("%d", eval());
    }
    return 0;
}
inline bool eval(){
    int r = op();
    while(s[i] == 'A' || s[i] == 'O'){
        if(s[i] == 'A'){
            i += 4;
            int r2 = op();
            if(r == 1 && r2 == 1)
                r = 1;
            else
                r = 0;
        }
        else{
            i += 3;
            int r2 = op();
            if(r == 1 || r2 == 1)
                r = 1;
            else
                r = 0;
        }
    }
    return r;
}
inline bool op(){
    int r = 0, ok = 0;
    while(s[i] == 'N' && s[i + 1] == 'O'){
        i += 4; ok = 1;
    }
    if(s[i] == 'T' && s[i + 1] == 'R')
        r = 1, i += 4;
    else if(s[i] == 'F' && s[i + 1] == 'A')
        r = 0, i += 5;
    else if(s[i] == '(')
        {++i; r = eval(); ++i;}
    else if(s[i] >= 'A' && s[i] <= 'Z')
        r = f[s[i]], ++i;
    if(s[i] == ' ') ++i;
    if(ok == 1) r = 1 - r;
    return r;
}