Cod sursa(job #3196672)

Utilizator AlexanderCernyCernaianu Alexandru AlexanderCerny Data 24 ianuarie 2024 16:24:49
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
/// Aceasta sursa este pentru problema
/// https://www.infoarena.ro/problema/bool
/// Punctaj: 100
/// Grupa de seniori - Clasa a X-a

#include <fstream>
#define DIM 1005

using namespace std;

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

char s[DIM],t[DIM];
char c;
int n,i,j,k;
int f[130];

int expOr();
int expAnd();
int expX();
int factor();

int expOr()
{
    int r=expAnd();
    while(t[i]=='|')
    {
        i++;
        r=(r|expAnd());
    }
    return r;
}
int expAnd()
{
    int r=expX();
    while(t[i]=='&')
    {
        i++;
        r=(r&expX());
    }
    return r;
}
int expX()
{
    int r=factor();
    while(t[i]=='^')
    {
        i++;
        r=(r^factor());
    }
    return r;

}
int factor()
{
    int r;
    if(t[i]=='(')
    {
        i++;
        r=expOr();
        i++;
    }
    else
    {
        if(t[i]=='0')
        {
            i++;
            return 0;
        }
        if(t[i]=='1')
        {
            i++;
            return 1;
        }
        return f[t[i++]];
    }
    return r;
}
int main()
{
    fin.get(s,DIM);
    fin.get();
    for(i=0;s[i]!=0;i++)
    {
        if(s[i]==' ')
            continue;
        if(s[i]=='('||s[i]==')')
        {
            t[++k]=s[i];
            continue;
        }
        if(s[i]=='T'&&s[i+1]=='R')
        {
            t[k++]='1';
            i+=3;
            continue;
        }
        if(s[i]=='F'&&s[i+1]=='A')
        {
            t[k++]='0';
            i+=4;
            continue;
        }
        if(s[i]=='O'&&s[i+1]=='R')
        {
            t[k++]='|';
            i++;
            continue;
        }
        if(s[i]=='A'&&s[i+1]=='N')
        {
            t[k++]='1';
            t[k++]='^';
            i+=2;
            continue;
        }
        t[k++]=s[i];
    }
    fin>>n;
    for(j=1;j<=n;j++)
    {
        fin>>c;
        f[c]=1-f[c];
        i=0;
        fout<<expOr();
    }
    return 0;
}