Cod sursa(job #84421)

Utilizator floringh06Florin Ghesu floringh06 Data 14 septembrie 2007 23:43:45
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<stdio.h>

int v[1005],m=0;
int vec[35];

int alpha(char x)
{
return ('A'<=x&&x<='Z');
}

int orr(int x,int y)
{
if(x==0&&y==0) return 0;
return 1;
}
int andd(int x,int y)
{
if(x&&y) return 1;
return 0;
}
int nott(int x)
{
if(x) return 0;
return 1;
}

int eval(int li,int lf)
{
if(li==lf)
  if(v[li]==27) return 0;
  else
  if(v[li]==28) return 1;
  else return vec[v[li]];

int desc,min,poz,i;
min=100;
desc=0;
for(i=li;i<=lf;i++)
   {
   if(v[i]==33) desc++;
   else
   if(v[i]==34) desc--;
   else
   if(desc==0&&v[i]>=30&&v[i]<=32&&v[i]<=min)
	  {
	  min=v[i];
	  poz=i;
	  }
   }
if(min==100)
  return eval(li+1,lf-1);
if(min==30)
   return orr(eval(li,poz-1),eval(poz+1,lf));
if(min==31)
   return andd(eval(li,poz-1),eval(poz+1,lf));
return nott(eval(poz+1,lf));
}

int main()
{
FILE *fin=fopen("bool.in","r"),*fout=fopen("bool.out","w");
int n=0,s[1005],i,aux;
char ch;
ch=fgetc(fin);
while(ch!='\n')
 {
 s[++n]=ch;
 ch=fgetc(fin);
 }
for(i=1;i<=n;i++)
 if(s[i]!=' ')
  {
  if(s[i]=='(')
     v[++m]=33;
  else
  if(s[i]==')')
      v[++m]=34;
  else
    {
    if(alpha(s[i]))
       if(alpha(s[i+1]))
	  {
	  if(s[i]=='N')
	     v[++m]=32,i+=2;
	  else
	  if(s[i]=='O')
	     v[++m]=30,i++;
	  else
	  if(s[i]=='A')
	     v[++m]=31,i+=2;
	  else
	  if(s[i]=='T')
	     v[++m]=28,i+=3;
	  else
	  if(s[i]=='F')
	     v[++m]=27,i+=4;
	  }
       else
	 v[++m]=s[i]-'A'+1;
    }
  }
for(ch='A';ch<='Z';ch++)
  vec[ch-'A'+1]=0;

fscanf(fin,"%d",&n);
ch=fgetc(fin);
for(i=1;i<=n;i++)
  {
  ch=fgetc(fin);
  aux=ch-'A'+1;
  if(vec[aux])
     vec[aux]=0;
  else vec[aux]=1;
  fprintf(fout,"%d",eval(1,m));
  }
fprintf(fout,"\n");
fcloseall();
return 0;
}