Pagini recente » Cod sursa (job #624424) | Cod sursa (job #1710731) | Cod sursa (job #683171) | Istoria paginii runda/becreative9 | Cod sursa (job #134409)
Cod sursa(job #134409)
#include <cstdio>
#include <string>
using namespace std;
int x[128], st[10512], sol, poz;
char buf[11024];
#define OR -3
#define NOT -1
#define AND -2
#define Open -4
#define Close -5
#define FALSE 31
#define TRUE 30
//1..29 Literele
//30 TRUE 31 FALSE
// -1 == NOT -2 == AND -3 == OR -5 == ( -4 == )
int expresie ();
int factor()
{
int aux;
if (st[poz] > 0)
aux = x[st[poz]],poz++;
else if (st[poz] == (NOT))
poz++,aux = !(factor ());
else if (st[poz] == (Open))
poz++,aux = expresie(),poz++;
return (aux);
}
int termen()
{
int aux = factor ();
while (st[poz] == (AND))
{
poz++;
aux &= factor ();
}
return (aux);
}
int expresie()
{
int aux = termen ();
while (st[poz] == (OR))
{
poz++;
aux |= termen ();
}
return (aux);
}
int main()
{
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
fgets(buf,11024,stdin);
// printf("%s", buf);
int dim = strlen(buf) - 1;
for (int i=0;i < dim;++i)
{
switch (buf[i])
{
//NOT
case 'N':
if (buf[i+1] == 'O')
{
st[++poz] = NOT;
i+=2;
} else st[++poz] = buf[i]-'A'+1;
break;
//TRUE
case 'T':
if (buf[i+1] == 'R')
{
st[++poz] = TRUE;
i+=3;
} else st[++poz] = buf[i]-'A'+1;
break;
//FALSE
case 'F':
if (buf[i+1] == 'A')
{
st[++poz] = FALSE;
i+=4;
} else st[++poz] = buf[i]-'A'+1;
break;
//OR
case 'O':
if (buf[i+1] == 'R')
{
st[++poz] = OR;
++i;
} else st[++poz] = buf[i]-'A'+1;
break;
//AND
case 'A':
if (buf[i+1] == 'N')
{
st[++poz] = AND;
i+=2;
} else st[++poz] = buf[i]-'A'+1;
break;
// (
case '(': st[++poz] = Open; break;
// )
case ')': st[++poz] = Close; break;
//LITERA
default : if(buf[i]^' ') st[++poz] = buf[i]-'A'+1;
}
}
st[++poz] = -88;
for(int i=0;i<32;++i)
x[i] = 0;
x[TRUE] = 1;
int t, ret; char c;
scanf("%d\n", &t);
while(t--)
{
scanf("%c", &c);
x[c-'A'+1] ^= 1;
poz = 1;
ret = expresie();
if (ret) ret = 1;
printf("%d", ret);
}
printf("\n");
return 0;
}