Cod sursa(job #84425)

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

int a[1010],na=0,v[40];

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

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

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

int nott(int x)
{
if(x==0) return 1;
return 0;
}

int eval(int li,int lf)
{
if(li==lf)
  if(a[li]>=50)
    return (a[li]-50);
  else return v[a[li]];
else
 {
 int min=110,par=0,i,poz,nr=1001;
 for(i=li;i<=lf;i++)
   if(a[i]==27) par++;
   else
   if(a[i]==28) par--;
   else
   {
   if(par==0&&a[i]>30&&a[i]<50&&a[i]<min)
      min=a[i],poz=i;
   if(par<nr) nr=par;
   }
 if(min==110)
    return eval(li+nr,lf-nr);
 else
 if(min==33)
   return nott(eval(poz+1,lf));
 else
 if(min==32)
   return andd(eval(li,poz-1),eval(poz+1,lf));
 else
   return orr(eval(li,poz-1),eval(poz+1,lf));
 }
}


int main()
{
FILE *fin=fopen("bool.in","r"),
     *fout=fopen("bool.out","w");
char s[1010],ch;
int i,n;
fgets(s,1010,fin);

for(i=0;s[i]!='\n';i++)
  if(s[i]!=' ')
   {
   if(s[i]=='(')
      a[++na]=27;
   else
   if(s[i]==')') a[++na]=28;
   else
   if(alpha(s[i]))
     if(alpha(s[i+1]))
       {
       if(s[i]=='N')
	 a[++na]=33,i+=2;
       else
       if(s[i]=='O')
	  a[++na]=31,i++;
       else
       if(s[i]=='A')
	 a[++na]=32,i+=2;
       else
       if(s[i]=='T')
	 a[++na]=51,i+=3;
       else
	 a[++na]=50,i+=4;
       }
     else
      a[++na]=s[i]-'A'+1;
   }

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