Cod sursa(job #1455907)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 29 iunie 2015 13:43:44
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.19 kb
#include <fstream>
#include <cstring>

using namespace std;

char initExpr[1001];
char changes[101];
char expr[1001];
bool values[30];

void modifyExpression()
{
    int l = strlen(initExpr);
    int i = 0;
    int j = 0;
    while(i < l)
    {
        if(initExpr[i] == ' ')
        {
            i++;
            continue;
        }
        else if(initExpr[i] == 'N')
        {
            if((i + 1 < l) && initExpr[i + 1] == 'O')
            {
                expr[j] = '!';
                i += 2;
            }
            else
                expr[j] = 'N';
        }
        else if(initExpr[i] == 'A')
        {
            if((i + 1 < l) && initExpr[i + 1] == 'N')
            {
                expr[j] = '&';
                i += 2;
            }
            else
                expr[j] = 'A';
        }
        else if(initExpr[i] == 'O')
        {
            if((i + 1 < l) && initExpr[i + 1] == 'R')
            {
                expr[j] = '|';
                i += 1;
            }
            else
                expr[j] = 'O';
        }
        else if(initExpr[i] == 'T')
        {
            if((i + 1 < l) && initExpr[i + 1] == 'R')
            {
                expr[j] = '1';
                i += 3;
            }
            else
                expr[j] = 'T';
        }
        else if(initExpr[i] == 'F')
        {
            if((i + 1 < l) && initExpr[i + 1] == 'A')
            {
                expr[j] = '0';
                i += 4;
            }
            else
                expr[j] = 'F';
        }
        else
            expr[j] = initExpr[i];
        i++;
        j++;
    }
}

bool evaluate(int & i)
{
    bool value = 0;
    bool t = 1;
    int l = strlen(expr);
    bool notActive = 0;
    bool temp;
    for(; i < l; i++)
    {
        if(expr[i] == '|')
        {
            value = value || t;
            t = 1;
        }
        else if(expr[i] == '!')
        {
            notActive = true;
        }
        else if(expr[i] >= 'A' && expr[i] <= 'Z')
        {
            if(!notActive)
                t = t && values[expr[i] - 'A'];
            else
            {
                t = t && (!values[expr[i] - 'A']);
                notActive = 0;
            }
        }
        else if(expr[i] == '0')
            t = false;
        else if(expr[i] == '(')
        {
            i++;
            if(!notActive)
            {
                temp = evaluate(i);
                t = t && temp;
            }
            else
            {
                temp = evaluate(i);
                t = t && (!temp);
                notActive = 0;
            }
        }
        else if(expr[i] == ')')
            break;
    }
    value = value || t;
    return value;
}

int main()
{
    int i;
    int n;
    int j;
    ifstream f("bool.in");
    f.getline(initExpr, 1000);
    f >> n;
    f >> changes;
    f.close();
    modifyExpression();
    ofstream g("bool.out");
    for(i = 0; i < n; i++)
    {
        values[changes[i] - 'A'] = !values[changes[i] - 'A'];
        j = 0;
        g << evaluate(j);
    }
    g << '\n';
    g.close();
    return 0;
}