Cod sursa(job #187193)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 1 mai 2008 15:50:09
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<stdio.h>
#include<string.h>

char e[2000],c;
int n,lg,i,j,a[200];

int EvalExp();
int EvalTermen();
inline int min(int,int);
inline int max(int,int);

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    i=0;
    scanf("%c",&e[0]);
    while (e[i]!='\n'){
	      i++;
	      scanf("%c",&e[i]);
	      if (e[i]==' ') 
             i--;
    }
    lg=i;
    scanf("%d\n",&n);
    
    for (i=1;i<=200;i++)
	    a[i]=0;

    for (j=1;j<=n;j++)
    {
	    scanf("%c",&c);
	    if (a[c]==0)    a[c]=1;
        else
                        a[c]=0;
	    i=0;
	    printf("%d",EvalExp());
    }
    printf("\n");
    return 0;
}

int EvalExp()
{int r=EvalTermen();
     while ((i<lg) && ((e[i]=='A' && e[i+1]=='N' && e[i+2]=='D')||(e[i]=='O' && e[i+1]=='R')))
     {
	   if (e[i]=='A')
	   {
	      i+=3;
	      r=min(r,EvalTermen());
	   }
	   else
	   {
           	i+=2;
	       r=max(r,EvalTermen());
	   }
     }
     return r;
}

int EvalTermen()
{int f;
     if (e[i]=='N' && e[i+1]=='O')
     {
                   i+=3;
                   f=1-EvalTermen();
                   return f;
     }
     else
     if (e[i]=='('){
	      i++;
	      f=EvalExp();
	      i++;
	      return f;
     }
     else
         {
	          if (e[i]=='T' && e[i+1]=='R'){
			     i+=4;
			     return 1;
              }
	          if (e[i]=='F' && e[i+1]=='A'){
			     i+=5;
			     return 0;
              }
              i++;
              return a[e[i-1]];
        }
}

inline int min(int a, int b){
       if (a<b)return a;
       else           return b;
}
inline int max(int a,int b){
       if(a>b)return a;
       else          return b;
}