Pagini recente » Cod sursa (job #433788) | Cod sursa (job #2040654) | Cod sursa (job #2830749) | Cod sursa (job #3175845) | Cod sursa (job #238846)
Cod sursa(job #238846)
#include <cstdio>
#include <cstring>
#include <cctype>
char *sir, pol[1005], start[1005], *end;
int k = 0, p = 0;
const int elsize = sizeof(int) * 8, NMAX = 102;
const int sz = NMAX / elsize + 1;
int el[30][sz] = {};
void exp();
void term();
void fact();
void exp()
{
term();
while(sir < end && !memcmp(sir, "OR", 2)) {
sir += 2;
term();
pol[p++] = '+';
}
}
void term()
{
fact();
while(sir < end && !memcmp(sir, "AND", 3)) {
sir += 3;
fact();
pol[p++] = '*';
}
}
void fact()
{
if ( *sir == '(' ) {
sir++;
exp();
sir++;
}
else if (!memcmp(sir, "NOT", 3)) {
sir += 3;
fact();
pol[p++] = '-';
}
else if (!memcmp(sir, "TRUE", 4)) {
sir += 4;
pol[p++] = '1';
}
else if (!memcmp(sir, "FALSE", 5)) {
sir += 5;
pol[p++] = '0';
}
else if (isalpha(*sir)) {
pol[p++] = *(sir++);
}
}
void sanitize(char x[])
{
int i, q = 0;
for (i = 0; x[i]; ++i)
if (x[i] != ' ') x[q++] = x[i];
x[q] = 0;
}
void create_polish_exp()
{
int lg;
sanitize(sir);
lg = strlen(sir);
end = sir + lg;
exp();
pol[p] = 0;
}
int* eval_polish_exp()
{
char *x = pol;
int stack[400][sz] = {}, top = 0, aux;
for (; *x; ++x)
if ( isalpha(*x) ) {
++top;
for (aux = 0; aux != sz; ++aux)
stack[top][aux] = el[*x - 'A'][aux];
}
else if (*x == '0') {
++top;
for (aux = 0; aux != sz; ++aux)
stack[top][aux] = 0;
}
else if (*x == '1') {
++top;
for (aux = 0; aux != sz; ++aux)
stack[top][aux] = ~0;
}
else if (*x == '-') {
for (aux = 0; aux != sz; ++aux)
stack[top][aux] = ~stack[top][aux];
}
else if (*x == '+') {
for (aux = 0; aux != sz; ++aux)
stack[top - 1][aux] |= stack[top][aux];
--top;
}
else if (*x == '*') {
for (aux = 0; aux != sz; ++aux)
stack[top - 1][aux] &= stack[top][aux];
--top;
}
int *t = new int [sz];
for (aux = 0; aux != sz; ++aux)
t[aux] = stack[1][aux];
return t;
}
int main()
{
int N, i, j;
char changes[NMAX];
sir = start;
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
scanf("%[^\n]s", sir);
create_polish_exp();
scanf("%d\n%s", &N, changes);
for (i = 0; i != N; ++i) {
el[ changes[i] - 'A' ][i / elsize] ^= (~0 << (i & (elsize - 1)));
for (j = i / elsize + 1; j != sz; ++j)
el[ changes[i] - 'A' ][j] = ~el[ changes[i] - 'A' ][j];
}
int *t = eval_polish_exp();
for (i = 0; i != N; ++i)
printf( "%d", bool(t[i / elsize] & (1 << (i & (elsize - 1)))) );
//printf("%s\n%s\n", sir, pol);
fclose(stdin); fclose(stdout);
return 0;
}