Cod sursa(job #3279795)

Utilizator Victor5539Tanase Victor Victor5539 Data 24 februarie 2025 14:43:13
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>
#include <cstring>
#include <iostream>
#include <unordered_map>

using namespace std;

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

const int MAX=1000;
char s[MAX+10],v[MAX+10],b;
unordered_map <char,bool> f;
int i,n,k,q;

int expresie();
int termen();
int termen2();
int termen3();
int constanta();


int main()
{
    fin.getline(s,1005);
    n=strlen(s);

    for (i=0; i<n; i++)
    {
        if (s[i]==' ')
            continue;

        if (s[i]=='(' || s[i]==')')
        {
            v[++k]=s[i];
            continue;
        }

        if (s[i]=='T' && s[i+1]=='R')
        {
            v[++k]='1';
            i+=3;
            continue;
        }

        if (s[i]== 'F' && s[i+1] == 'A')
        {
            v[++k] = '0';
            i+=4;
            continue;
        }
        if (s[i] == 'O' && s[i+1] == 'R')
        {
            v[++k] = '|';
            i++;
            continue;
        }
        if (s[i]=='A' && s[i+1] == 'N')
        {
            v[++k] = '&';
            i+=2;
            continue;
        }
        if (s[i] == 'N' && s[i+1] == 'O')
        {
            v[++k] = '1';
            v[++k] = '^';
            i+=2;
            continue;
        }
        v[++k] = s[i];
    }

    n=k;

    fin>>q;

    while (q)
    {
        fin>>b;
        f[b]=1^f[b];
        i=1;

        fout<<expresie();
        q--;
    }

    return 0;
}

int termen3()
{
    int r;
    if (v[i]=='(')
    {
        i++;
        r=expresie();
        i++;
    }
    else
    {
        if (v[i]=='0')
            r=0;
        else
        if (v[i]=='1')
            r=1;
        else
            r=f[v[i]];
    }

    return r;
}

int termen2()
{
    int r=termen3();

    while (v[i]=='^')
    {
        i++;
        r=(r^termen3());
    }

    return r;
}

int termen()
{
    int r=termen2();

    while (v[i]=='&')
    {
        i++;
        r=(r&termen2());
    }

    return r;
}

int expresie()
{
    int r=termen();

    while (v[i]=='|')
    {
        i++;
        r=(r|termen());
    }
    return r;
}