Cod sursa(job #2790749)

Utilizator stefandutastefandutahoria stefanduta Data 29 octombrie 2021 14:06:38
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.8 kb
#include <fstream>
#include <cstring>
#define NMAX 1005
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
char s[NMAX], v[NMAX];
int frecv[NMAX];
int i, n, k, rez;

bool isdigit (char x)
{
    return x >= '0' && x <= '9';
}

//int si();
//int sau();
int sisau();

int factor ()
{
    //out << v[i] << '\n';
    int nr;
    if (v[i] == '!')
    {
        ++i;
        nr = (sisau() + 1) % 2;
        ++i;
        //out << 1 << '\n';
    }
    else if (v[i] == '(')
    {
        //out << 2 << '\n';
        ++i;
        nr = sisau();
        ++i;
    }
    else if (isdigit(v[i]))
    {
        //out << 3 << '\n';
        nr = v[i] - '0';
        ++i;
    }
    return nr;
}

/*int si ()
{
    int rez = factor();
    while (s[i] == '&')
    {
        ++i;
        int x = factor();
        if (rez == 1 && x == 1)
            rez = 1;
        else
            rez = 0;
    }
    return rez;
}

int sau ()
{
    int rez = si();
    while (s[i] == '|')
    {
        ++i;
        int x = si();
        if(rez == 0 && x == 0)
            rez = 0;
        else
            rez = 1;
    }
    return rez;
}*/

int sisau ()
{
    int rez = factor();
    while (v[i] == '&' || v[i] == '|')
    {
        ++i;
        int x = factor();
        if (v[i] == '&')
        {
            if(rez == 1 && x == 1)
                rez = 1;
            else
                rez = 0;
        }
        else if (v[i] == '|')
        {
            if (rez == 0 && x == 0)
                rez = 0;
            else
                rez = 1;
        }
    }
    return rez;
}

void transformare()
{
    i = 0;
    k = 0;
    while (i < n)
    {
        if (s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D')
        {
            v[k] = '&';
            ++k;
            i = i + 2;
        }
        else if (s[i] == 'O' && s[i + 1] == 'R')
        {
            v[k] = '|';
            ++k;
            i = i + 1;
        }
        else if (s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T')
        {
            v[k] = '!';
            ++k;
            i = i + 2;
        }
        else if (s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E')
        {
            v[k] = '1';
            ++k;
            i = i + 3;
        }
        else if (s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E')
        {
            v[k] = '0';
            ++k;
            i = i + 4;
        }
        else if (s[i] == '(' || s[i] == ')')
        {
            v[k] = s[i];
            ++k;
        }
        else if (s[i] >= 'A' && s[i] <= 'Z')
        {
            v[k] = frecv[s[i]] + '0';
            ++k;
        }
        ++i;
    }
}
int main()
{
    int j;
    char ch;
    in.getline(s, NMAX);
    n = strlen(s);

    int N;
    in >> N;
    in.get();
    for (j = 1; j <= N; j++)
    {
        in.get(ch);
        //out << ch << '\n';
        frecv[ch] = (frecv[ch] + 1) % 2;

        transformare();

        i = 0;
        rez = factor();
        while (i < k)
        {
            if (v[i] == '&')
            {
                ++i;
                int x = factor();
                if (rez == 1 && x == 1)
                    rez = 1;
                else
                    rez = 0;
            }
            else if (v[i] == '|')
            {
                ++i;
                int x = factor();
                if (rez == 0 && x == 0)
                    rez = 0;
                else
                    rez = 1;
            }
        }
        out << rez;
        //out << " " << i << '\n';

        /*for (int l = 0; l < k; l++)
        {
            out << v[l];
        }
        out << '\n';*/
    }
    return 0;
}