Cod sursa(job #84428)

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

char pol[1005];
int np=0,cnt,v[100];

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

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

int is_val(char x)
{
return (is_alpha(x)||x=='1'||x=='0');
}

int val(char x)
{
if(x=='0'||x=='1')
  return (x-'0');
return v[x];
}

int eval()
{
char a[1005];
int i,n=np,j,k,q;
for(i=1;i<=np;i++) a[i]=pol[i];
a[n+1]=0;

while(a[2]!=0)
 {
 for(i=1;i<=n;i++)
   if(a[i]=='!')
      {
      if(is_val(a[i-1]))
           break;
      }
   else
   if(a[i]=='&'||a[i]=='|')
      {
      if(is_val(a[i-1])&&is_val(a[i-2]))
	  break;
      }

 if(a[i]=='!')
    {
    k=val(a[i-1]);
    k^=1;
    a[i-1]=k+'0';

    for(j=i;j<=n;j++) a[j]=a[j+1];
    n--;
    }
 else
 if(a[i]=='&')
    {
    k=val(a[i-1]);
    q=val(a[i-2]);
    k&=q;
    a[i-2]=k+'0';

    for(j=i-1;j<n;j++) a[j]=a[j+2];
    n-=2;
    }
 else
    {
    k=val(a[i-1]);
    q=val(a[i-2]);
    k|=q;
    a[i-2]=k+'0';

    for(j=i-1;j<n;j++) a[j]=a[j+2];
    n-=2;
    }
 }


return (a[1]-'0');
}

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

char s[1005],oper[1005],x,c;
int no=0,i,n;
fin.get(s,1005);
fin.get();
oper[0]='(';
for(i=0;s[i];i++)
 if(s[i]!=' ')
 {
 if(s[i]=='(')
   oper[++no]='(';
 else
 if(s[i]==')')
    {
    while(oper[no]!='(')
       pol[++np]=oper[no--];
    no--;
    }
 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(oper[no])>grad(x))
	     pol[++np]=oper[no--];
	 oper[++no]=x;
	 }
       else
	 {
	 if(s[i]=='T')
	    pol[++np]='1',i+=3;
	 else
	    pol[++np]='0',i+=4;
	 }
       }
    else
       pol[++np]=s[i];
    }
 }
while(no)
  pol[++np]=oper[no--];


for(c='A';c<='Z';c++) v[c]=0;
fin>>n;
fin.get();
fin.get(s,1005);
for(i=0;i<n;i++)
  {
  v[s[i]]^=1;
  cnt=eval();
  fout<<cnt;
  }


fin.close();
fout.close();

return 0;
}