Cod sursa(job #84436)

Utilizator floringh06Florin Ghesu floringh06 Data 15 septembrie 2007 00:01:28
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
using namespace std;
#include<fstream>
#include<stdio.h>

int v[1005],m=0;
int vec[35];

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

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

int eval(int li,int lf)
{
if(li==lf)
  if(v[li]==27) return 0;
  else
  if(v[li]==28) return 1;
  else return vec[v[li]];

int desc,min,poz,i;
min=100;
desc=0;
for(i=li;i<=lf;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)
  return eval(li+1,lf-1);
if(min==30)
   return orr(eval(li,poz-1),eval(poz+1,lf));
if(min==31)
   return andd(eval(li,poz-1),eval(poz+1,lf));
return nott(eval(poz+1,lf));
}

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

int n=0,i,aux;
char s[1005];
 
fin.get(s,1005);
for(n=0;;n++)
    if(s[n] == 0)
        break;
 
for(i=0;i<n;i++)
 if(s[i]!=' ')
  {
  if(s[i]=='(')
     v[++m]=33;
  else
  if(s[i]==')')
      v[++m]=34;
  else
    {
    if(alpha(s[i]))
       if(alpha(s[i+1]))
	  {
	  if(s[i]=='N')
	     v[++m]=32,i+=2;
	  else
	  if(s[i]=='O')
	     v[++m]=30,i++;
	  else
	  if(s[i]=='A')
	     v[++m]=31,i+=2;
	  else
	  if(s[i]=='T')
	     v[++m]=28,i+=3;
	  else
	  if(s[i]=='F')
	     v[++m]=27,i+=4;
	  }
       else
	 v[++m]=s[i]-'A'+1;
    }
  }
  
char ch;
for(ch='A';ch<='Z';ch++)
  vec[ch-'A'+1]=0;

fin>>n;
char x[1004];
fin>>x;
for(i=0;i<n;i++)
  {
  aux=x[i]-'A'+1;
  if(vec[aux])
     vec[aux]=0;
  else vec[aux]=1;
  fout<<eval(1,m);
  }
fout<<"\n";

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