Cod sursa(job #84431)

Utilizator floringh06Florin Ghesu floringh06 Data 14 septembrie 2007 23:46:44
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
using namespace std;
#include<fstream>
#include<string.h>

int a[30];

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

int grad(char x)
{
if(x=='@') return 0;
if(x=='|') return 1;
if(x=='&') return 2;
return 3;
}

int val(char x)
{
if(is_alpha(x))
  return a[x-'A'+1];
return (x-'0');
}

int eval(char s[])
{
//caut paranteze in interior pe care le evaluez
int li,lf,cat,i,n;
char aux[1000],naux;

for(li=0;s[li];li++)
  if(s[li]=='(')
   {
   //caut unde se termina
   lf=li+1;
   cat=1;
   naux=-1;
   while(!(s[lf]==')'&&cat==1))
      {
      if(s[lf]=='(') cat++;
      if(s[lf]==')') cat--;
      aux[++naux]=s[lf];
      lf++;
      }
   aux[naux+1]=0;

   s[li]=eval(aux)+'0';

   i=li+1;lf++;
   while(s[lf])
      {
      s[i]=s[lf];
      i++;lf++;
      }
   s[i]=0;
   }

//evaluare expresie
//caut de fiecare data operatorul cu cea mai mare precedenta
n=li-1;
int poz,k,q;
char min;

while(n)
 {
 min='@';
 for(i=0;s[i];i++)
   if(is_alpha(s[i])==0&&s[i]!='0'&&s[i]!='1'&&s[i]!='('&&s[i]!=')')
     {
     if(grad(min)<grad(s[i]))
	{
	poz=i;
	min=s[i];
	}
     else
     if(grad(min)==grad(s[i])&&grad(min)==3&&i==poz+1)
	poz=i;
     }
 if(min=='!')
   {
   k=val(s[poz+1]);
   k^=1;
   s[poz]=k+'0';

   for(i=poz+1;i<=n;i++) s[i]=s[i+1];
   n--;
   }
 else
   {
   k=val(s[poz-1]);
   q=val(s[poz+1]);
   if(min=='&')
     k&=q;
   else k|=q;
   s[poz-1]=k+'0';

   for(i=poz;i<n;i++) s[i]=s[i+2];
   n-=2;
   }
 }

return (s[0]-'0');
}


int main()
{
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005],v[1005],cop[1005];
int i,n=-1,nr;
fin.get(s,1005);

for(i=0;s[i];i++)
 if(s[i]!=' ')
  {
  if(is_alpha(s[i])&&is_alpha(s[i+1]))
     {
     if(s[i]=='N')
       v[++n]='!',i+=2;
     else
     if(s[i]=='A')
       v[++n]='&',i+=2;
     else
     if(s[i]=='O')
       v[++n]='|',i++;
     else
     if(s[i]=='F')
       v[++n]='0',i+=4;
     else
     if(s[i]=='T')
       v[++n]='1',i+=3;
     }
  else
     v[++n]=s[i];
  }
v[n+1]=0;

memset(a,0,sizeof a);
fin>>nr;
fin.get();
fin.get(s,1005);
for(i=0;i<nr;i++)
 {
 a[s[i]-'A'+1]^=1;
 strcpy(cop,v);
 fout<<eval(cop);
 }
fout<<"\n";

fin.close();
fout.close();
return 0;
}