Cod sursa(job #2204065)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 14 mai 2018 12:42:33
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
const int Nmax = 2048;
int N,p,a[40];
char s[Nmax];

void skip()
{
    while (s[p]==' ') ++p;
}

int var();
int eval();

int var()
{
    int ret;
    if (s[p]=='T' && s[p+1]=='R' && s[p+2]=='U' && s[p+3]=='E')
    {
        p+=4;
        skip();
        return 1;
    }
    if (s[p]=='F' && s[p+1]=='A' && s[p+2]=='L' && s[p+3]=='S' && s[p+4]=='E')
    {
        p+=5;
        skip();
        return 0;
    }
    ret=a[s[p]-'A'];
    ++p;
    return ret;
}

int fact()
{
    int neg,ret,val;
    skip();
    neg=0;
    while ( s[p]=='N' && s[p+1]=='O' && s[p+2]=='T')
    {
        neg^=1;
        p+=3;
        skip();
    }

    if (s[p]=='(')
    {
        ++p;
        ret=eval();
        ++p;
        skip();
    }
    else
        ret=var();
    ret^=neg;
    skip();
    while (s[p]=='A' && s[p+1]=='N' && s[p+2]=='D')
    {
        p+=3;
        skip();
        neg=0;
        while (s[p]=='N' && s[p+1]=='O' && s[p+2]=='T')
        {
            neg^=1;
            p+=3;
            skip();
        }
        if (s[p]=='(')
        {
            ++p;
            val=eval();
            ++p;
        }
        else
            val=var();

        val=val^neg;
        ret=ret&val;

        skip();
    }
    return ret;
}

int eval()
{
    int val,ret;
    ret=fact();
    skip();
    while (s[p]=='O' && s[p+1]=='R')
    {
        p+=2;
        skip();
        val=fact();
        ret=ret|val;
        skip();
    }
    return ret;
}

void readsolve()
{
    char i,ch;
    in.get(s,Nmax);
    in >> N;
    for (i=0;i<N;++i)
    {
        in >> ch;
        a[ch-'A']^=1;
        p=0;
        out << eval();
    }
}

int main()
{
    readsolve();
    return 0;
}