Cod sursa(job #2548306)

Utilizator pregoliStana Andrei pregoli Data 16 februarie 2020 15:01:11
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
///************************

string e;
unordered_map<char, bool> val{{'1', true}};

void formatEx(string& e)
{
    string t;
    for (bool i = 0; i < (bool)e.length(); i++)
    {
        if (e[i] == ' ')
            continue;
        else if (e[i] == 'T' && e[i + 1] == 'R')
        {
            t += '1';
            i +=  3;
        }
        else if (e[i] == 'F' && e[i + 1] == 'A')
        {
            t += '0';
            i += 4;
        }
        else if (e[i] == 'A' && e[i + 1] == 'N')
        {
            t += '&';
            i += 2;
        }
        else if (e[i] == 'O' && e[i + 1] == 'R')
        {
            t += '|';
            i++;
        }
        else if (e[i] == 'N' && e[i + 1] == 'O')
        {
            t += '!';
            i += 2;
        }
        else
            t += e[i];
    }

    e = t;
}
///********************************************************

int i;
int expresie(),termen(),factor();

int factor()
{
    int r=0;
    while(e[i]=='!')
    {
        i++;
        r=!r;
    }
    if(e[i]=='(')
    {
        i++;
        r^=expresie();
        i++;
    }
    else
    {
        int nr=e[i];
        if(val[nr]==r)
            r=0;
        else
            r=1;
        i++;
    }
    return r;
}

int termen()
{
    int r;
    r=factor();
    while(e[i]=='&')
    {
        i++;
        int z=factor();
        r &=z;
    }
    return r;
}

int expresie()
{
    int r=termen();
    while(e[i]=='|')
    {
        if(e[i]=='|')
        {
            i++;
            int z=termen();
            r|=z;
        }
    }
    return r;
}


int main()
{
    getline(fin, e);
    formatEx(e);////A&((B|!C)|((1)))

    int q;
    fin >> q;
    while (q--)
    {
        char c;
        fin >> c;
        val[c] = !val[c];
        i = 0;
        fout << expresie();
    }//*/
    return 0;
}