Cod sursa(job #2792168)

Utilizator stefandutastefandutahoria stefanduta Data 1 noiembrie 2021 00:57:42
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 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, j, l;

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

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 si();
int sau();

int factor ()
{
    int nr;
    if (isdigit(v[i]))
    {
        nr = v[i] - '0';
        ++i;
    }
    else if (v[i] == '!')
    {
        int neg = 0;
        while (v[i] == '!')
        {
            neg = (neg + 1) % 2;
            ++i;
        }
        nr = (v[i] - '0' + neg) % 2;
    }
    else if (v[i] == '(')
    {
        ++i;
        sau();
        ++i;
    }
    return nr;
}

int sau ()
{
    int rez = si();
    while (s[i] == '|')
    {
        int x = si();
        rez = rez | x;
    }
    return rez;
}

int si ()
{
    int rez = factor();
    while (s[i] == '&')
    {
        int x = factor();
        rez = rez & x;
    }
    return rez;
}

int main()
{
    char ch;
    in.getline(s, NMAX);
    n = strlen(s);

    int N;
    in >> N;
    for (j = 1; j <= N; j++)
    {
        in >> ch;
        frecv[ch] = (frecv[ch] + 1) % 2;
        transformare();

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