Cod sursa(job #276518)

Utilizator DraStiKDragos Oprica DraStiK Data 11 martie 2009 10:56:21
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#define DIM 1005
#define ABC 30
char s[DIM],*p=s;
int a[ABC];
int n;
int eval ();
int termen ();
int factor ();
int operat ();
int main ()
{
    freopen ("bool.in","r",stdin);
    freopen ("bool.out","w",stdout);
    char ch;
    int i;
    gets (s);
    scanf ("%d\n",&n);
    for (i=1; i<=n; ++i)
    {
        scanf ("%c",&ch);
        a[ch-'A']^=1;
        p=s;
        printf ("%d",eval ());
    }
    return 0;
}
int eval ()
{
    int r=termen ();
    while (*p=='O' && *(p+1)=='R')
    {
        p+=3;
        r|=termen ();
    }
    return r;
}
int termen ()
{
    int r=factor ();
    while (*p=='A' && *(p+1)=='N' && *(p+2)=='D')
    {
        p+=4;
        r&=factor ();
    }
    return r;
}
int factor ()
{
    int r;
    if (*p=='(')
    {
        ++p;
        r=eval ();
        ++p;
    }
    else if (*p=='N' && *(p+1)=='O' && *(p+2)=='T')
    {
        p+=4;
        r=!factor ();
    }
    else if (*p=='T' && *(p+1)=='R' && *(p+2)=='U' && *(p+3)=='E')
    {
        p+=5;
        r=1;
    }
    else if (*p=='F' && *(p+1)=='A' && *(p+2)=='L' && *(p+3)=='S' && *(p+4)=='E')
    {
        p+=6;
        r=0;
    }
    else
    {
        r=a[*p-'A'];
        p+=2;
    }
    return r;
}