Cod sursa(job #3338778)

Utilizator Rizi_SanNen Ioana Madlena Rizi_San Data 4 februarie 2026 23:52:30
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <fstream>
#include <cstring>
using namespace std;

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

const int N=1e3;
int n, p, cnt;
char init[N+1], litere[N+1], s[N+1];
bool aux[32];
///imi trebuie multiple expresii
///valoare (true sau false), litera mare, () expresie logica, not e minus cum ar veni, and, or - prioritate minima

bool factor();
bool expresie_and();

bool expresie_or()
{
    bool current=expresie_and();
    while (s[p]=='|')
    {
        current = (expresie_and() || current);
        p++;
    }
    return current;
}

bool expresie_and()
{
    bool current=factor();
    while (s[p]=='&')
    {
        current = (factor() && current);
        p++;
    }
    return current;
}

bool factor()
{
    bool val=true;
    int semn = 1;
    while (s[p] == '-')
    {
        p++;
        semn = -semn;
    }
    if (s[p]== '(')
    {
        p++;
        val=expresie_or();
        p++;
        if (!semn)
        {
            val=(!val);
        }
        return val;
    }
    if (s[p]=='0')
    {
        p++;
        return false;
    }
    if (s[p]=='1')
    {
        p++;
        return true;
    }
    int poz=s[p] - 'A';
    p++;
    val=aux[poz];
    if (!semn)
    {
        val = (!val);
    }
    return val;
}


///voi modifica sirul astfel incat voi avea & - AND, OR - |, NOT = -, TRUE = 1, FALSE = 0;
void modificare()
{
    int i=0;
    while (i<strlen(init))
    {
        if (init[i]>='A' && init[i]<='Z' && (init[i+1] == ')'|| init[i+1]==' '))
        {
            s[cnt]=init[i];
            i++;
            cnt++;
            //s.insert(i, (char)(s[p] - 'A' + 2));
        }
    else if (init[i] == 'T' && init[i+1] == 'R')
        {
            //strcpy(s+i, s+i+4);
            //s.insert(i, '1');
            s[cnt] = '1';
            cnt++;
            i+=4;
        }
    else if (init[i] == 'F' && init[i+1] == 'A')
        {
            //strcpy(s+i, s+i+5);
            //s.insert(i, '0');
            s[cnt] = '0';
            cnt++;
            i+=5;
        }
    else if (init[i]=='N' && init[i+1] == 'O')
        {
            s[cnt] = '-';
            i+=3;
        }
    else if (init[i] == '(' || init[i] == ')')
        {
            if (init[i]=='(')
              s[cnt] = '(';
            else s[cnt] = ')';
            cnt++;
            i++;
        }
    else if (init[i]=='O' && init[i+1] == 'R')
        {
            s[cnt] = '|';
            cnt++;
            i+=2;
        }
    else if (init[i]=='A' && init[i+1] == 'N')
        {
            s[cnt]='&';
            i+=3;
        }
        else i++;
    }
}

int main()
{
    in.get(init, N+1);
    modificare();
    in >> n;
    in >> litere;
    modificare();
    for (int i=0; i<n; i++)
    {
        aux[(litere[i]-'A')]=!aux[(litere[i]-'A')];
        p=0;
        out<<expresie_or();
    }
    return 0;
}