Cod sursa(job #255031)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 8 februarie 2009 13:54:40
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>

using namespace std;

int e[28], n, i, j, k, l, r;
char v[1200], ch;

int expresie();
int termen();
int factor();

int expresie()
{
    int rez = termen();
    
    while(v[l]=='O' && v[l+1]=='R')
    {
        l+=3;
        rez = rez | termen();
    }
    
    return rez;
}

int termen()
{
    int rez = factor();
    
    while(v[l]=='A' && v[l+1]=='N' && v[l+2]=='D')
    {
        l+=4;
        rez = rez & factor();
    }
    
    return rez;
}

int factor()
{
    int rez=0;
    if(v[l]=='N' && v[l+1]=='O' && v[l+2]=='T')
    {
        l+=4;
        rez = factor();
        return !rez;
    }
    if(v[l]=='(')
    {
        l++;
        rez = expresie();
        l++;
    }
    else
    if(v[l]=='T' && v[l+1]=='R' && v[l+2]=='U' && v[l+3]=='E')
    {
        l+=5;
        rez=1;
    }
    else
    if(v[l]=='F' && v[l+1]=='A' && v[l+2]=='L' && v[l+3]=='S' && v[l+4]=='E')
    {
        l+=6;
        rez=0;
    }
    else
    {
        rez=e[ v[l] - 'A' ];
        l+=2;
    }
    return rez;
}
        

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    n=1;
    scanf("%c", &v[n]);
    while(v[n]>=32)
    {
        n++;
        scanf("%c", &v[n]);
    }
    for(i=0; i<=26; i++)
    {
        e[i]=0;
    }
    scanf("%d\n", &k);
    for(i=1; i<=k; i++)
    {
        scanf("%c", &ch);
        e[ch-'A'] = e[ch-'A'] ^ 1;
        l=1;
        r=expresie();
        printf("%d", r);
    }
    printf("\n");
    return 0;
}