Cod sursa(job #818819)

Utilizator ericptsStavarache Petru Eric ericpts Data 18 noiembrie 2012 00:37:03
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>

using namespace std;


char s[1010];
char *p;
bool val['Z'-'A'+5];
bool lowest_level();
bool eval2();
bool evaluate()
{
    while(*p == ' ')
        ++p;
    bool v1,v2;
    v1 = eval2();
    while(*p == ' ')
        ++p;
    while(*p == 'O' && *(p+1) == 'R')
    {
        p+= 3;
        v2 = eval2();
        v1 = v1 || v2;
    }
    return v1;
}

bool eval2()
{
    while(*p == ' ')
        ++p;
    bool v1,v2;
    v1 = lowest_level();
    while(*p == ' ')
        ++p;
    while(*p == 'A' && *(p+1) == 'N')
    {
        p+=4;
        v2 = lowest_level();
        v1 = v1 && v2;
    }
    return v1;
}

bool lowest_level()
{
    bool ret;
    while(*p == ' ')
        ++p;
    if(*p == '(')
    {
        ++p;
        ret =  evaluate();
        ++p;
    }
    else if(*p == 'T' && *(p+1) == 'R')
    {
        p+= 5;
        ret =  1;
    }
    else if(*p == 'F' && *(p+1) == 'A')
    {
        p+= 6;
        ret =  0;
    }
    else if(*p == 'N' && *(p+1) == 'O')
    {
        p+= 4;
        ret = !lowest_level();
    }
    else if(*p >= 'A' && *p <= 'Z' && !(*(p+1) <= 'Z' && *(p+1) >= 'A'))
    {
        p+=2;
        ret = val[*(p-2)-'A'];
    }
    return ret;
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    gets(s);
    int n,i;
    char c;
    scanf("%d\n",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%c",&c);
        val[c-'A']^=1;
        p = s;
        printf("%d",evaluate());
    }
    return 0;
}