Cod sursa(job #3281040)

Utilizator rapidu36Victor Manz rapidu36 Data 28 februarie 2025 09:36:05
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <fstream>

using namespace std;

const int NS = 1000;
const int NT = 100;
const int NL = 26;

char s[NS+1], t[NT+1];
bool val_ad[NL];
int p;

bool expresie();
bool termen();
bool factor();

bool este_litera(char c)
{
    return ('A' <= c && c <= 'Z');
}

void transforma(char s[])
{
    int i = 0, n_ramase = 0;
    while (s[i] != '\0')
    {
        if (este_litera(s[i]))
        {
            if (s[i] == 'A' && s[i+1] == 'N')
            {
                s[n_ramase++] = '&';
                i += 3;
            }
            else if (s[i] == 'O' && s[i+1] == 'R')
            {
                s[n_ramase++] = '|';
                i += 2;
            }
            else if (s[i] == 'N' && s[i+1] == 'O')
            {
                s[n_ramase++] = '!';
                i += 3;
            }
            else if (s[i] == 'T' && s[i+1] == 'R')
            {
                s[n_ramase++] = '1';
                i += 4;
            }
            else if (s[i] == 'F' && s[i+1] == 'A')
            {
                s[n_ramase++] = '0';
                i += 5;
            }
            else///s[i] este o variabila
            {
                s[n_ramase++] = s[i];
                i += 1;
            }
        }
        else if (s[i] == '(' || s[i] == ')')
        {
            s[n_ramase++] = s[i];
            i += 1;
        }
        else///s[i] este un spatiu
        {
            i += 1;///nu scriem nimic
        }
    }
    s[n_ramase] = '\0';
}

int main()
{
    ifstream in("bool.in");
    ofstream out("bool.out");
    in.getline(s, NS + 1);
    transforma(s);
    //out << s << "\n";
    int n;
    in >> n >> t;
    for (int i = 0; i < n; i++)
    {
        val_ad[t[i]-'A'] = (!val_ad[t[i]-'A']);
        p = 0;
        out << expresie();
    }
    out << "\n";
    in.close();
    out.close();
    return 0;
}

bool expresie()
{
    bool val = termen();
    while (s[p] == '|')
    {
        p++;
        val = termen() or val;
    }
    return val;
}

bool termen()
{
    bool val = factor();
    while (s[p] == '&')
    {
        p++;
        val = factor() and val;
    }
    return val;
}

bool factor()
{
    bool negatie = false;
    while (s[p] == '!')
    {
        negatie = (!negatie);
        p++;
    }
    if (s[p] == '(')
    {
        p++;
        bool val = expresie();
        p++;
        if (negatie)
        {
            val = (!val);
        }
        return val;
    }
    bool val;
    if (este_litera(s[p]))
    {
        val = val_ad[s[p]-'A'];
    }
    else if (s[p] == '1')
    {
        val = true;
    }
    else///s[p] == '0'
    {
        val = false;
    }
    p++;
    if (negatie)
    {
        val = (!val);
    }
    return val;
}