Cod sursa(job #187189)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 1 mai 2008 15:30:31
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 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]=='('){
	      i++;
	      f=EvalExp();
	      i++;
     }
     else{
	 if (e[i]=='N' && e[i+1]=='O' && e[i+2]=='T'){
		       i+=3;
		       if (e[i]=='T' && e[i+1]=='R' && e[i+2]=='U' && e[i+3]=='E'){
			  i+=4;
			  return 0;
		       }
		       if (e[i]=='F' && e[i+1]=='A' && e[i+2]=='L' && e[i+3]=='S' && e[i+4]=='E'){
			   i+=5;
			   return 1;
		       }
		       i++;
		       return 1-a[e[i-1]];
	 }
	 else{
	     if (e[i]=='T' && e[i+1]=='R' && e[i+2]=='U' && e[i+3]=='E'){
			  i+=4;
			  return 0;
	     }
	     if (e[i]=='F' && e[i+1]=='A' && e[i+2]=='L' && e[i+3]=='S' && e[i+4]=='E'){
			  i+=5;
			  return 1;
	     }
             i++;
             return a[e[i-1]];
         }
     }
     return f;    
}

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;
}