Pagini recente » Cod sursa (job #3153382) | Cod sursa (job #2687061) | Cod sursa (job #2169480) | Cod sursa (job #2253919) | Cod sursa (job #74191)
Cod sursa(job #74191)
#include <cstdio>
#include <string>
#define fin "bool.in"
#define fout "bool.out"
#define Nmax 10001
#define DBGx
#define FL
char buff[Nmax],e[Nmax],epol[Nmax],v[256];
int N,dim,p,st[Nmax],dim1,poz[Nmax];
int grad[256]; //tin gradul operanzilor
void transf()
{
int i;
st[0]=0;
dim1=0;
for (i=1;i<=dim;++i)
{
if (e[i]>='A' && e[i]<='Z' || e[i]=='t' || e[i]=='f' )
epol[++dim1]=e[i];
else
if (e[i]=='(')
st[++st[0]]=e[i];
else
if (e[i]==')')
{
while (st[st[0]]!='(' && st[0]>0)
epol[++dim1]=st[st[0]--];
--st[0];
}
else
{
while ( grad[(int)e[i]]<grad[st[st[0]]] || (e[i]=='!' && e[i-1]!='!' && st[st[0]]=='!') && st[0]>0 )
epol[++dim1]=st[st[0]--];
st[++st[0]]=e[i];
}
#ifdef DBG
for (int j=1;j<=st[0];++j)
printf("%c",st[j]);
printf("\n");
for (int j=1;j<=dim1;++j)
printf("%c",epol[j]);
printf("\n");
#endif
}
}
int eval()
{
int i;
st[0]=0;
for (i=1;i<=dim1;++i)
{
if ('A'<=epol[i] && epol[i]<='Z' || epol[i]=='t' || epol[i]=='f')
st[++st[0]]=v[(int)epol[i]];
if (epol[i]=='!')
st[st[0]]=!st[st[0]];
if (epol[i]=='|')
{
st[st[0]-1]=(st[st[0]]|st[st[0]-1]);
--st[0];
}
if (epol[i]=='&')
{
st[st[0]-1]=(st[st[0]]&st[st[0]-1]);
--st[0];
}
}
return st[1];
}
int main()
{
int i;
char c;
freopen(fin,"r",stdin);
#ifdef FL
freopen(fout,"w",stdout);
#endif
fgets(buff,Nmax,stdin);
#ifdef DBG
printf("%s\n",buff);
#endif
dim=1;
e[dim]='(';
for (i=0;buff[i]!='\n';)
{
if (buff[i]=='A')
if (buff[i+1]!='N')
{
++i;
e[++dim]='A';
}
else
{
i+=3;
e[++dim]='&';
}
else
if (buff[i]=='N')
if (buff[i+1]!='O')
{
++i;
e[++dim]='N';
}
else
{
i+=3;
e[++dim]='!';
}
else
if (buff[i]=='O')
if (buff[i+1]!='R')
{
++i;
e[++dim]='O';
}
else
{
i+=2;
e[++dim]='|';
}
else
if (buff[i]=='T')
if (buff[i+1]!='R')
{
++i;
e[++dim]='T';
}
else
{
i+=4;
e[++dim]='t';
}
else
if (buff[i]=='F')
if (buff[i+1]!='A')
{
++i;
e[++dim]='F';
}
else
{
i+=5;
e[++dim]='f';
}
else
if (buff[i]==')')
{
++i;
e[++dim]=')';
}
else
if (buff[i]=='(')
{
++i;
e[++dim]='(';
}
else
{
if (buff[i]!=' ')
e[++dim]=buff[i];
++i;
}
}
++dim;
e[dim]=')';
#ifdef DBG
for (i=1;i<=dim;++i)
printf("%c",e[i]);
printf("\n");
#endif
grad[(int)'|']=1;
grad[(int)'&']=2;
grad[(int)'!']=3;
grad[(int)'(']=0;
transf(); //transform expresia e in form poloneza postfixata
#ifdef DBG
for (i=1;i<=dim1;++i)
printf("%c",epol[i]);
printf("\n");
#endif
scanf("%d",&N);
fgetc(stdin);
v[(int)'t']=1; v[(int)'f']=0;
for (i=0;i<N;++i)
{
c=fgetc(stdin);
v[(int)c]=(!v[(int)c]);
printf("%d",eval());
}
return 0;
}