Cod sursa(job #3279764)

Utilizator Victor5539Tanase Victor Victor5539 Data 24 februarie 2025 13:35:54
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <cstring>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");


const int MAX=100000;
int n,i,sol,cnt;
char v[MAX+10],b;
unordered_map <char,bool> f;

bool verifor();
bool verifand();
bool verifnot();
int constanta();
int termen2();
int termen();
int expresie();

int main()
{
    fin.getline(v,MAX+5);
    cnt=strlen(v);

    fin>>n;

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

        sol=expresie();
        fout<<sol;

        n--;
    }

    return 0;
}

bool verifor()
{
    if (i+1>=cnt)
        return false;

    return (v[i]=='O' && v[i+1]=='R');
}

bool verifand()
{
    if (i+2>=cnt)
        return false;

    return (v[i]=='A' && v[i+1]=='N' && v[i+2]=='D');
}

bool verifnot()
{
    if (i+2>=cnt)
        return false;

    return (v[i]=='N' && v[i+1]=='O' && v[i+2]=='T');
}

int termen2()
{
    int r;
    if (v[i]==' ')
        i++;

    if (v[i]=='(')
    {
        i++;
        r=expresie();
        i++;
    }
    else
    {
        if (verifnot())
        {
            i++;
            i++;
            i++;
            r=(1^expresie());
        }
        else
        {
            r=constanta();
        }
    }

    return r;
}


int termen()
{
    if (v[i]==' ')
        i++;

    int r=termen2();

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

    return r;
}

int expresie()
{
    if (v[i]==' ')
        i++;

    int r=termen();

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

    return r;
}

int constanta()
{
    if (v[i]==' ')
        i++;

    return f[v[i]];
}