Pagini recente » Cod sursa (job #1217879) | Profil MilenaPOPA | Cod sursa (job #2277553) | Monitorul de evaluare | Cod sursa (job #84428)
Cod sursa(job #84428)
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;
}