Cod sursa(job #1642150)

Utilizator akaprosAna Kapros akapros Data 9 martie 2016 12:55:05
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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 eval();
bool term();
bool fact1();
bool fact2();

bool ok()
{
    if(*p == 'N' && *(p + 1) == 'O')
        return 1;
    if(*p == 'A' && *(p + 1) == 'N')
        return 1;
    if(*p == 'O' && *(p + 1) == 'R')
        return 1;
    return 0;
}
bool eval()
{
    bool val = term();
    if(*p == ' ') ++ p;
    while(*p == 'O' && *(p + 1) == 'R')
    {
        p += 2;
        if(*p == ' ') ++ p;
        val = val | term();
    }
    return val;
}
bool term()
{
    bool val = fact1();
    if(*p == ' ') ++ p;
    while(*p == 'A' && *(p + 1) == 'N')
    {
        p += 3;
        if(*p == ' ') ++ p;
        val = val & fact1();
    }
    return val;
}
bool fact1()
{
    bool val = fact2();
    if(*p == ' ') ++ p;
    while(*p == 'N' && *(p + 1) == 'O')
    {
        p += 3;
        if(*p == ' ') ++ p;
        val = ~fact2();
    }
    return val;
}
bool fact2()
{
    bool val = 0;
    if(*p == ' ') ++ p;
    if(*p == '(')
    {
        ++ p;
        val = eval();
        if(*p == ' ') ++ p;
        ++ p;
    }
    if(*p == 'T' && *(p + 1) == 'R')
    {
        val = 1;
        p += 4;
    }
    if(*p == 'F' && *(p + 1) == 'A')
    {
        val = 0;
        p += 5;
    }
    if(*p >= 'A' && *p <= 'Z' && !ok())
    {
        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", eval());
        }
    else printf("%d", eval());
}
int main()
{
    read();
    solution();
    return 0;
}