Cod sursa(job #818805)

Utilizator ericptsStavarache Petru Eric ericpts Data 18 noiembrie 2012 00:17:02
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>

using namespace std;


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

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

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;
}