Cod sursa(job #255011)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 8 februarie 2009 13:32:33
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>

using namespace std;

int e[26], 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();
    }
  //  printf("%d\n", l);
    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 = expresie();
        return rez ^ 1;
    }
    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
    {
      //  printf("%d ", l);
     //   printf("%d\n", v[l]);
        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=1; i<=n; i++)
    {
        printf("%c", v[i]);
    }*/
    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;
}