Pagini recente » Cod sursa (job #1225428) | Cod sursa (job #3247649) | Cod sursa (job #2057599) | Cod sursa (job #199599) | Cod sursa (job #84424)
Cod sursa(job #84424)
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;
}