Cod sursa(job #3196701)

Utilizator Horia123144Musat Horia Gabriel Horia123144 Data 24 ianuarie 2024 17:02:27
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005],t[1005],c;
int i,k,n,f[150];
int expresieOr();
int expresieAnd();
int expresieXor();
int expresieOr();
int factor();
int expresieOr()
{
    int r=expresieAnd();
    while(t[i]=='|')
    {
        i++;
        r=(r||expresieAnd());
    }
    return r;
}
int expresieAnd()
{
    int r=expresieXor();
    while(t[i]=='&')
    {
        i++;
        r=(r&&expresieXor());
    }
    return r;
}
int expresieXor()
{
    int r=factor();
    while(t[i]=='!')
    {
        i++;
        r=(r^factor());
    }
    return r;
}
int factor()
{
    int r;
    if(t[i]=='(')
    {
        i++;
        r=expresieOr();
        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.getline(s,1005);
    fin>>n;
    for(i=0; i<strlen(s); i++)
    {
        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]=='N' && s[i+1]=='O')
        {
            t[k++]='1';
            t[k++]='!';
            i+=2;
            continue;
        }
        if(s[i]=='A' && s[i+1]=='N')
        {
            t[k++]='&';
            i+=2;
            continue;
        }
        t[k++]=s[i];
    }
    for(int z=1; z<=n; z++)
    {
        fin>>c;
        f[c]=1-f[c];
        i=0;
        fout<<expresieOr();
    }
    return 0;
}