Cod sursa(job #1839261)

Utilizator silkMarin Dragos silk Data 2 ianuarie 2017 17:37:33
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <cstring>
#define NMax 1005

char s[NMax+1];
char e[NMax+1];
char t[256];
int p,nr,lg,T;

int Expr();
int NOT();
int AND();
int OR();

void Read()
{
    fgets(s,NMax,stdin);
    nr = strlen(s)-1;

    for(int i = 0; i < nr; )
    if( s[i] == ' ' ) ++i;
    else if( s[i] == 'A' && s[i+1] == 'N' ) e[lg++] = '&', i+=3;
    else if( s[i] == 'O' && s[i+1] == 'R' ) e[lg++] = '|', i+=2;
    else if( s[i] == 'N' && s[i+1] == 'O' ) e[lg++] = '~', i+=3;
    else if( s[i] == 'T' && s[i+1] == 'R' ) e[lg++] = '1', i+=4;
    else if( s[i] == 'F' && s[i+1] == 'A' ) e[lg++] = '0', i+=5;
    else e[lg++] = s[i++];
}

int NOT()
{
    int f;
    if(e[p] == '(' ){
        ++p;
        f = Expr();
        ++p;
    } else {
        if( e[p] == '1' || e[p] == '0' ) f = e[p] - '0';
        else f = t[ e[p] ];
        ++p;
    }
    return f;
}

int AND()
{
    int f,q=0;
    if( e[p] == '~' ){
        q = 1;
        ++p;
    }
    f = NOT();
    return q ^ f;
}

int OR()
{
    int t = AND();
    while(p < lg && e[p] == '&')
    {
        ++p;
        t = t & AND();
    }
    return t;
}

int Expr()
{
    int t = OR();
    while(p < lg && e[p] == '|')
    {
        ++p;
        t = t | OR();
    }
    return t;
}

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

    Read();
    scanf("%d\n",&T);
    while(T--)
    {
        char c;
        scanf("%c",&c);
        t[c] = 1-t[c];
        printf("%d", Expr() );
        p = 0;
    }


return 0;
}