Cod sursa(job #84424)

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

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

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

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

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

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

int eval(nod x)
{
if(is_alpha(x->inf))
   return v[x->inf-'A'+1];
if(x->inf=='0'||x->inf=='1')
   return (x->inf-'0');
if(x->inf=='&')
   return (eval(x->st)&eval(x->dr));
if(x->inf=='|')
   return (eval(x->st)|eval(x->dr));
return (eval(x->st)^1);
}

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

char s[1005],op[1005],x;
int nop=0,i,n,k;

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

	  while(grad(x)<grad(op[nop]))
	      pol[++npol]=op[nop--];
	  op[++nop]=x;
	  }
	else
	  {
	  if(s[i]=='F')
	    pol[++npol]='0',i+=4;
	  else
	    pol[++npol]='1',i+=3;
	  }
	}
      else
	pol[++npol]=s[i];
    }
while(nop)
   pol[++npol]=op[nop--];
pol[0]=' ';
pol[npol+1]=0;


//generare arbor
nod vf;
vf=new arb;
vf->inf=pol[npol];
complet(vf);

fin>>n;
fin.get();
fin.get(s,1005);
fin.get();

for(i=1;i<=26;i++) v[i]=0;

for(i=0;i<n;i++)
 {
 v[s[i]-'A'+1]^=1;
 k=eval(vf);
 fout<<k;
 }
fout<<"\n";

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