Cod sursa(job #263185)

Utilizator andumMorie Daniel Alexandru andum Data 19 februarie 2009 23:08:22
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>  
#define NMAX 1201

char s[NMAX],c;
int i,n,e[50],l;

int eval();
int factor();
int termen();

int eval()
{
 int r=termen();

 while (s[l]=='O' && s[l+1]=='R')
    {
	 l+=3;
	 r=r | termen();
    }
 return r;
}

int termen()
{
 int r=factor();

 while (s[l]=='A' && s[l+1]=='N' && s[l+2]=='D')
    {
	 l+=4;
	 r=r & factor();
    }
 return r;
}

int factor()
{
 int r=0;

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

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