Cod sursa(job #1641944)

Utilizator erich98erich stan erich98 Data 9 martie 2016 11:44:21
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define DIM 1005
#define NMAX 105
FILE *fin  = freopen("bool.in", "r", stdin);
FILE *fout = freopen("bool.out", "w", stdout);

using namespace std;
int n;
char s[DIM], *p, sw[NMAX];
bool v[28];

bool OR();
bool AND();
bool NOT();
bool FACT();

bool OR()
{
    bool val = AND();
    if(*p == ' ') ++ p;
    while(*p == 'O')
    {
        p += 2;
        if(*p == ' ') ++ p;
        val = val | AND();
    }
    return val;
}
bool AND()
{
    bool val = NOT();
    if(*p == ' ') ++ p;
    while(*p == 'N')
    {
        p += 3;
        if(*p == ' ') ++ p;
        val = val & NOT();
    }
    return val;
}
bool NOT()
{
    bool val = FACT();
    if(*p == ' ') ++ p;
    while(*p == 'N')
    {
        p += 3;
        if(*p == ' ') ++ p;
        val = ~FACT();
    }
    return val;
}
bool FACT()
{
    bool val = 0;
    if(*p == ' ') ++ p;
    if(*p == '(')
    {
        ++ p;
        val = OR();
        if(*p == ' ') ++ p;
        ++ p;
    }
    if(*p == 'T')
    {
        val = 1;
        p += 4;
    }
    if(*p == 'F')
    {
        val = 0;
        p += 5;
    }
    if(*p >= 'A' && *p <= 'Z')
    {
        val = v[*p - 'A'];
        ++ p;
        if(*p == ' ') ++ p;
    }
    return val;
}
void read()
{
    gets(s);
    scanf("%d\n", &n);
    gets(sw);
}
void solution()
{
    if(n)
        for(int i = 0; i < n; ++ i)
        {
            p = s;
            v[sw[i] - 'A'] = v[sw[i] - 'A'] ^ 1;
            printf("%d", OR());
        }
    else printf("%d", OR());
}
int main()
{
    read();
    solution();
    return 0;
}