Cod sursa(job #1497547)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 6 octombrie 2015 22:20:46
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 1000 + 10;

int i , n , m , p;
int info[30];

char ch , S[Nmax];

string sir;

bool op2();
bool op3();

bool op1()
{
    bool ret = op2();
    if (sir[p] == '|')
        p++, ret |= op2();

    return ret;
}

bool op2()
{
    bool ret = op3();
    if (sir[p] == '&')
        p++, ret &= op3();
    return ret;
}

bool op3()
{
    bool ret;
    if (sir[p] == '!')
    {
        p++;
        return 1 ^ op3();
    }

    if (sir[p] == '(')
        p++, ret = op1(), p++;
    else
        ret = info[sir[p]-'A'], p++;

    return ret;
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    gets(S+1); n = strlen(S+1);

    info['Z'-'A'+2] = 1; sir = ' ';
    for (i = 1; i <= n; ++i)
    {
        if (S[i] == ' ') continue;
        if (!strncmp(S+i , "TRUE" , 4)) sir = sir + 'Z', sir[sir.size()-1] += 2, i += 3;
        else if (!strncmp(S+i , "FALSE" , 5)) sir = sir + 'Z', sir[sir.size()-1] += 1, i += 4;
        else if (!strncmp(S+i , "OR" , 2)) sir = sir + '|', i++;
        else if (!strncmp(S+i , "AND" , 3)) sir = sir + '&', i += 2;
        else if (!strncmp(S+i , "NOT" , 3)) sir = sir + '!', i += 2;
        else sir = sir + S[i];
    }

    scanf("%d\n", &m);
    for (i = 1; i <= m; ++i)
    {
        scanf("%c", &ch);
        info[ch-'A'] ^= 1; p = 1;
        printf("%d", op1());
    }

    return 0;
}