Cod sursa(job #2819451)

Utilizator AxicaVirtosu Alexandra Mihaela Axica Data 18 decembrie 2021 13:04:11
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>

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

const int DimMax=1000;
char s[DimMax+3], c, v[DimMax+3];
int nr=-1, i;
int n;
bool fr[100];

int expresieOr();
int expresieAnd();
int expresieNot();
int factor();

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

int expresieAnd()
{
    int r=expresieNot();
    while(v[i]=='&')
    {
        i++;
        r=(r&&expresieNot());
    }
    return r;
}

int expresieNot()
{
    int r=factor();
    while(v[i]=='^')
    {
        i++;
        r=(r^factor());
    }
    return r;
}

int factor()
{
    int r;
    if(v[i]=='(')
    {
        i++;
        r=expresieOr();
        i++;
    }
    else
    {
        if(v[i]=='1')
        {
            i++;
            return 1;
        }
        if(v[i]=='0')
        {
            i++;
            return 0;
        }
        return fr[v[i++]];
    }
    return r;
}
int main()
{
    fin.getline(s, DimMax+1);
    for(i=0; s[i]; i++)
    {
        if(s[i]==' ')
            continue;
        if(s[i]=='A' && s[i+1]=='N')
        {
            v[++nr]='&';
            i+=2;
            continue;
        }
        if(s[i]=='O' && s[i+1]=='R')
        {
            v[++nr]='|';
            i++;
            continue;
        }
        if(s[i]=='N' && s[i+1]=='O')
        {
            v[++nr]='1';
            v[++nr]='^';
            i+=2;
            continue;
        }
        if(s[i]=='T' && s[i+1]=='R')
        {
            v[++nr]='1';
            i+=3;
            continue;
        }
        if(s[i]=='F' && s[i+1]=='A')
        {
            v[++nr]='0';
            i+=4;
            continue;
        }
        if(s[i]=='(' || s[i]==')')
        {
            v[++nr]=s[i];
            continue;
        }
        v[++nr]=s[i];
    }
    //fout<<v<<"\n";
    fin>>n;
    for(int j=1; j<=n; j++)
    {
        fin>>c;
        fr[c]=1-fr[c];
        i=0;
        fout<<expresieOr();
    }
 return 0;
}