Cod sursa(job #1366918)

Utilizator BugirosRobert Bugiros Data 1 martie 2015 14:47:34
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.93 kb
#include <cstdio>
#include <vector>
using namespace std;
//70
const int MAXSIR = 1030;

const int MAXLITERE = 'Z' - 'A' + 2;

char sir[MAXSIR];

bool variabila[MAXLITERE];

void citire()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    gets(sir);
}

int i = 0;

char termen[10];
int l_termen;

void det_termen()
{
    l_termen = 0;
    while('A' <= sir[i] && sir[i] <= 'Z')
    {
        termen[++l_termen] = sir[i];
        ++i;
    }
}

const int AND = 1;
const int OR = 2;

/*void adaugare_termen(bool val, bool &rasp, bool &inceput, int idoperator, bool &nu)
{
    if (nu)
        val = !val;
    if (!inceput)
    {
        inceput = true;
        rasp = val;
    }
    else
    {
        if (idoperator == AND)
            rasp = rasp && val;
        if (idoperator == OR)
            rasp = rasp || val;
    }
    nu = false;
}*/

char deeval[MAXSIR];
int leval;


bool eval()
{
    bool aux = true;
    bool inceput = false;
    bool aux2;
    int poz = 1;
    deeval[leval + 1] = 0;
    if (deeval[1] == '1' &&
        deeval[2] == 'A' &&
        deeval[3] == '1' &&
        deeval[4] == 'S' &&
        deeval[5] == '0')
        deeval[leval + 1] = 0;

    while(poz <= leval && (deeval[poz] == '0' || deeval[poz] == '1'))
    {
        aux2 = (deeval[poz] == '1');

        while (deeval[poz + 1] == 'A')
        {
            poz += 2;
            aux2 = aux2 && (deeval[poz] == '1');
        }
        if (!inceput)
        {
            aux = aux2;
            inceput = true;
        }
        else aux = aux || aux2;
        poz += 2;
    }
    #ifdef DEBUG
    for (poz = 1;poz <= leval;++poz)
        printf("%c",deeval[poz]);
    printf(" -> %d\n",aux);
    #endif
    return aux;
}



bool cetermen(bool b, bool &nu)
{
    if (nu)
    {
        nu = false;
        return !b;
    }
    else return b;
}

bool expresie()
{
    vector<bool> termeni;
    vector<int> operatori;
    bool nu = false;

    while(sir[i] != 0 && sir[i] != ')')
    {
        if ('A' <= sir[i] && sir[i] <= 'Z')
        {
            det_termen();
            if (l_termen == 1)
                termeni.push_back(cetermen(variabila[termen[1] - 'A'],nu));
            if (l_termen == 2 && termen[1] == 'O' && termen[2] == 'R')
                operatori.push_back(OR);
            if (l_termen == 3 && termen[1] == 'A' && termen[2] == 'N' && termen[3] == 'D')
                operatori.push_back(AND);
            if (l_termen == 3 && termen[1] == 'N' && termen[2] == 'O' && termen[3] == 'T')
                nu = true;
            if (l_termen == 4 && termen[1] == 'T' && termen[2] == 'R' && termen[3] == 'U' && termen[4] == 'E')
                termeni.push_back(cetermen(true,nu));
            if (l_termen == 5 && termen[1] == 'F' && termen[2] == 'A' && termen[3] == 'L' && termen[4] == 'S' && termen[5] == 'E')
                termeni.push_back(cetermen(false,nu));
        }
        if (sir[i] == '(')
        {
            ++i;
            termeni.push_back(cetermen(expresie(),nu));
        }
        if (sir[i] == ' ')
            ++i;
    }

    ++i;
    leval = 0;
    deeval[++leval] = '0' + (char)termeni[0];
    for (int poz = 0;poz < operatori.size();++poz)
    {
        deeval[++leval] = (operatori[poz] == AND)?'A':'S';
        deeval[++leval] = '0' + (char)termeni[poz + 1];
    }
    return eval();
}

int main()
{
    int n;
    char c;
    citire();
    scanf("%d\n",&n);
    for (int test = 1;test <= n;++test)
    {
        if (test == 70)
            test = 70;

        #ifdef DEBUG
        printf("=%d=\n",test);
        #endif // DEBUG
        scanf("%c",&c);
        variabila[c - 'A'] = !variabila[c - 'A'];
        i = 0;
        #ifdef DEBUG
        printf("||\n\\/\n%d\n_______________\n",expresie()?1:0);
        #else
        printf("%d",expresie()?1:0);
        #endif
    }
    return 0;
}