Cod sursa(job #84423)

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

int v[1010],nr2=0,vec[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==1) return 0;
return 1;
}


int eval(int li,int ls)
{
int min,i,poz,desc;
if(li==ls)
  if(v[li]==27) return 1;
  else if(v[li]==28) return 0;
        else return vec[v[li]];
else
  {
  desc=0;
  min=100;
  for(i=li;i<=ls;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) eval(li+1,ls-1);
   else
   if(min==30)
      return orr(eval(li,poz-1),eval(poz+1,ls));
   else 
   if(min==31)
      return andd(eval(li,poz-1),eval(poz+1,ls));
   else
      return nott(eval(poz+1,ls));
  }
}

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

ch=fgetc(fin);
while(ch!='\n')
 {
 n++;
 s[n]=ch;
 ch=fgetc(fin);
 }
s[n+1]=0;

i=0;
while(i<n)
{
i++;
if(s[i]!=' ') nr2++;
if(alpha(s[i]))
  if(alpha(s[i+1]))
     {
     if(s[i]=='N')
           v[nr2]=32,i+=2;
     else 
     if(s[i]=='A') 
           v[nr2]=31,i+=2;
     else
     if(s[i]=='O')
           v[nr2]=30,i++;
     else
     if(s[i]=='T')
	   v[nr2]=27,i+=3;
     else
       v[nr2]=28,i+=4;
     }
  else v[nr2]=s[i]-'A'+1;
else if(s[i]=='(') v[nr2]=33;
      else if(s[i]==')') v[nr2]=34;
}

for(ch='A';ch<='Z';ch++) vec[ch-'A'+1]=0;
fscanf(fin,"%d",&n);
ch=fgetc(fin);

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