Cod sursa(job #130261)
Utilizator | Data | 31 ianuarie 2008 18:27:41 | |
---|---|---|---|
Problema | Bool | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.45 kb |
#include <cstdio>
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]];
++poz;
} else
if(st[poz] == NOT)
{
++poz;
aux = !(expresie());
} 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,1024,stdin);
// printf("%s", buf);
for (int i=0;buf[i]!='\n';++i)
{
switch (buf[i])
{
//SPATIU
case ' ': break;
//NOT
case 'N':
if (buf[i+1] == 'O')
{
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+=2;
} else st[++poz] = buf[i]-'A';
break;
// (
case '(': st[++poz] = Open; break;
// )
case ')': st[++poz] = Close; break;
//LITERA
default : st[++poz] = buf[i]-'A';
}
}
x[TRUE] = 1;
int t, ret; char c;
scanf("%d\n", &t);
while(t--)
{
scanf("%c", &c);
x[c-'A'] ^= 1;
poz = 1;
ret = expresie();
printf("%d", ret);
}
printf("\n");
return 0;
}