Cod sursa(job #2846464)

Utilizator AndreiN96Andrei Nicula AndreiN96 Data 9 februarie 2022 11:32:52
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <fstream>
#include <cstring>
 
using namespace std;
 
const int D = 1001 , N = 100;
char sir[D] , modif[N] , aux[D];
int num , k , poz;
bool ok[N];
 
void transform()
{
    int dim = strlen(aux);
    for (int i = 0 ; i < dim ; i ++)
    {
        if (strchr("()" , aux[i]) == NULL)
        {
            if ((i == 0 || strchr(" ()" , aux[i - 1]) != NULL)
            && (i == dim - 1 || strchr(" ()" , aux[i + 1]) != NULL))
            {
                sir[k ++] = aux[i];
            }
            else
            {
                if (strncmp(aux + i , "TRUE" , 4) == 0)
                {
                    sir[k ++] = '1';
                    i += 3;
                }
                else if (strncmp(aux + i , "FALSE" , 5) == 0)
                {
                    sir[k ++] = '0';
                    i += 4;
                }
                else if (strncmp(aux + i , "AND" , 3) == 0)
                {
                    sir[k ++] = '&';
                    i += 2;
                }
                else if (strncmp(aux + i , "OR" , 2) == 0)
                {
                    sir[k ++] = '|';
                    i ++;
                }
                else if (strncmp(aux + i , "NOT" , 3) == 0)
                {
                    sir[k ++] = '!';
                    i += 2;
                }
            }
        } 
        else
        {
            sir[k ++] = aux[i];
        }
    }
}
 
bool expresie();
bool factor();
 
bool expresie()
{
    bool expr = factor();
    while (sir[poz] == '|' || sir[poz] == '&')
    {
        if (sir[poz] == '|')
        {
            poz ++;
            if (sir[poz] == '1' || sir[poz] == '0')
            {
                if (sir[poz] == '1')
                    expr = true || factor();
                else
                    expr = false || factor();
            }
            else
            {
                if (ok[sir[poz] - 'A'])
                    expr = true || factor();
                else
                    expr = false || factor();
            }
        }
        else
        {
            poz ++;
            if (sir[poz] == '1' || sir[poz] == '0')
            {
                if (sir[poz] == '1')
                    expr = true && factor();
                else
                    expr = false && factor();
            }
            else
            {
                if (ok[sir[poz] - 'A'])
                    expr = true && factor();
                else
                    expr = false && factor();
            }
        }
        
    }
    return expr;
}
bool factor()
{
    bool semn = true;
    while (sir[poz] == '!')
    {
        poz ++;
        if (semn)
            semn = false;
        else
            semn = true;
    }
    while (sir[poz] == '(')
    {
        poz ++;
        bool expr = expresie();
        poz ++;
        return semn && expr; 
    }
    return semn && ok[sir[poz] - 'A'];
}
 
int main()
{
    ifstream in("bool.in");
    ofstream out("bool.out");
 
    in.getline(aux , D);
    in >> ws >> num >> ws;
    in.getline(modif , N);
    in.close();
 
    transform();
    
    for (int i = 0 ; i < num ; i ++)
    {
        if (ok[modif[i] - 'A'])
        {
            ok[modif[i] - 'A'] = false;
        }
        else
        {
            ok[modif[i] - 'A'] = true;
        }
        bool rez = expresie();
        if (rez)
            out << 1;
        else
            out << 0;
    }
    return 0;
}