Cod sursa(job #2312907)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 5 ianuarie 2019 18:48:39
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("bool.in");
ofstream g ("bool.out");

int eval();
int termen();
int factor();
int valoare();

int n, vf, m, val[30];

char ch, *p;

char sirin[1105], sir[1105];

void transform_sir()
{
    vf = 0;
    for (int i = 0; i < n;)
    {
        if (sirin[i] == 'A' && sirin[i+1] == 'N')
        {
            sir[++vf] = '&';
            i += 3;
        }
        else if (sirin[i] == 'O' && sirin[i+1] == 'R')
        {
            sir[++vf] = '|';
            i += 2;
        }
        else if (sirin[i] == 'N' && sirin[i+1] == 'O')
        {
            sir[++vf] = '!';
            i += 3;
        }
        else if (sirin[i] == 'T' && sirin[i+1] == 'R')
        {
            sir[++vf] = 't';
            i += 4;
        }
        else if (sirin[i] == 'F' && sirin[i+1] == 'A')
        {
            sir[++vf] = 'f';
            i += 5;
        }
        else
        {
            if (sirin[i] >= 'A' && sirin[i] <= 'Z' || sirin[i] == '(' || sirin[i] == ')')
                sir[++vf] = sirin[i];

            ++i;
        }
    }
}

int eval()
{
    int r = termen();

    while (*p == '|')
    {
        p++;
        r = r | termen();
    }

    return r;
}

int termen()
{
    int r = factor();

    while (*p == '&')
    {
        p++;
        r = r & factor();
    }

    return r;
}

int factor()
{
    if (*p == '!')
    {
        p++;
        return !factor();
    }

    return valoare();
}

int valoare()
{
    int res = 0;

    if (*p == 't')
    {
        p++;
        return true;
    }
    else if (*p == 'f')
    {
        p++;
        return false;
    }
    else if (*p >= 'A' && *p <= 'Z')
    {
        res = val[*p - 'A'];
        p++;
    }
    else if (*p == '(')
    {
        p++;
        res = eval();
        p++;
    }

    return res;

}
int main()
{
    f.getline(sirin, 1010);
    n = strlen(sirin);

    transform_sir();

    f >> m;

    for (; m; --m)
    {
        f >> ch;
        val[ch - 'A'] ^= 1;
        p = sir;
        p++;

        g << eval();
    }
    return 0;
}