Cod sursa(job #84422)

Utilizator floringh06Florin Ghesu floringh06 Data 14 septembrie 2007 23:44:08
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
using namespace std;
#include<fstream>

char pol[1005];
int npol=0;
int v[30],q;

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

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

struct arb{char inf;arb* st,*dr;};
typedef arb* nod;

void go(nod x)
{
if(!(is_alpha(x->inf)||x->inf=='0'||x->inf=='1'))
 {//e operator
  if(x->inf=='!')
    {
    x->st=new arb;
    x->st->inf=pol[--npol];
    go(x->st);
    }
  else
    {
    x->st=new arb;
    x->st->inf=pol[--npol];
    go(x->st);
    x->dr=new arb;
    x->dr->inf=pol[--npol];
    go(x->dr);
    }
 }
}

int eval(nod vf)
{
if(vf->inf=='1'||vf->inf=='0')
   return q=(vf->inf-'0');
if(is_alpha(vf->inf))
   return q=v[vf->inf-'A'+1];

if(vf->inf=='&')
  return q=(eval(vf->st)&eval(vf->dr));
if(vf->inf=='|')
  return q=(eval(vf->st)|eval(vf->dr));
return q=(eval(vf->st)^1);
}

int main()
{
ifstream fin("bool.in");
ofstream fout("bool.out");

char s[1005],oper[1000],op;
int i,noper=0;
oper[0]='(';

fin.get(s,1005);
pol[0]=' ';
for(i=0;s[i];i++)
  if(s[i]!=' ')
   {
   if(s[i]=='(')
      oper[++noper]='(';
   else
   if(s[i]==')')
      {
      while(oper[noper]!='(')
	 pol[++npol]=oper[noper--];
      noper--;
      }
   else
   if(is_alpha(s[i]))
     {
     if(is_alpha(s[i+1]))
       {//e operator
       if(s[i]=='N'||s[i]=='A'||s[i]=='O')
	{
	if(s[i]=='N')
	   op='!',i+=2;
	else
	if(s[i]=='A')
	   op='&',i+=2;
	else
	if(s[i]=='O')
	   op='|',i++;

	//incerc sa bag in oper
	//verific prioritati
	if(grad(oper[noper])>grad(op))
	  {
	  while(grad(oper[noper])>grad(op))
	     {
	     pol[++npol]=oper[noper];
	     noper--;
	     }
	  oper[++noper]=op;
	  }
	else
	  oper[++noper]=op;
	}
       else
	{//e true sau false
	 if(s[i]=='F')
	   pol[++npol]='0',i+=4;
	 else
	   pol[++npol]='1',i+=3;
	}
       }
     else
       {//e variabila
	pol[++npol]=s[i];
       }
     }
   }
while(noper) pol[++npol]=oper[noper--];
pol[npol+1]=0;

//arboru
nod vf;
vf=new arb;
vf->inf=pol[npol];
pol[0]='.';
go(vf);

for(i=1;i<=26;i++) v[i]=0;
int n;
fin>>n;
fin.get();
fin.get(s,1005);
for(i=0;i<n;i++)
   {
   v[s[i]-'A'+1]^=1;
   fout<<eval(vf);
   }
fout<<"\n";

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