Cod sursa(job #130252)
Utilizator | Data | 31 ianuarie 2008 18:05:48 | |
---|---|---|---|
Problema | Bool | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.44 kb |
#include <cstdio>
#include <stding>
using namespace std;
int x[32], st[512], sol, poz;
char buf[1024];
#define OR -3
#define NOT -1
#define AND -2
#define Open -4
#define Close -5
#define FALSE 31
#define TRUE 30
int expresie();
int factor()
{
int aux;
if(st[poz] > 0)
{
aux = x[st[poz]-'A'];
++poz;
} else
if(st[poz] == NOT)
{
++poz;
aux = !(expresie());
} else
if(st[poz] == Open)
{
++poz;
aux = expresie();
++poz;
}
return aux;
}
int termen()
{
int aux=1;
while(st[poz] == -2)
{
++poz;
aux &= factor();
}
return aux;
}
int expresie()
{
int aux=0;
while(st[poz] == -3)
{
++poz;
aux |= termen();
}
return aux;
}
int main()
{
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
scanf("%s", buf);
for (int i=0;buf[i]!='\n';++i)
{
switch (buf[i])
{
//SPATIU
case ' ': ++i;
//NOT
case 'N':
if (buf[i+1] == '0')
{
st[++poz] = NOT;
i+=2;
} else st[++poz] = buf[i]-'A';
break;
//TRUE
case 'T':
if (buf[i+1] == 'R')
{
st[++poz] = TRUE;
i+=3;
} else st[++poz] = buf[i]-'A';
break;
//FALSE
case 'F':
if (buf[i+1] == 'A')
{
st[++poz] = FALSE;
i+=4;
} else st[++poz] = buf[i]-'A';
break;
//OR
case 'O':
if (buf[i+1] == 'R')
{
st[++poz] = OR;
++i;
} else st[++poz] = buf[i]-'A';
break;
//AND
case 'A':
if (buf[i+1] == 'N')
{
st[++poz] = AND;
i+=4;
} else st[++poz] = buf[i]-'A';
break;
// (
case ')': st[++poz] = Open;
// )
case '(': st[++poz] = Close;
//LITERA
default : st[++poz] = buf[i]-'A'; break;
}
}
x[TRUE] = 1;
int t, ret; char c;
scanf("%d\n", &t);
while(t--)
{
scanf("%c", &t);
x[t-'A'] ^= 1;
poz = 1;
ret = expresie();
printf("%d", ret);
}
printf("\n");
return 0;
}