Cod sursa(job #1994355)

Utilizator Neamtu_StefanStefan Neamtu Neamtu_Stefan Data 24 iunie 2017 19:33:51
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>

using namespace std;

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

char s[1002],v[1002];
int n,cnt;
int val[30];

void normalizare()
{
    for (int i=0;s[i];i++)
    {
        if (s[i]==' ')continue;
        if (s[i]=='O' && s[i+1]=='R')
        {
            v[cnt++]='|';
            i++;
            continue;
        }
        if (s[i]=='A' && s[i+1]=='N')
        {
            v[cnt++]='&';
            i+=2;
            continue;
        }
        if (s[i]=='N' && s[i+1]=='O')
        {
            v[cnt++]='1';
            v[cnt++]='!';
            i+=2;
            continue;
        }
        if (s[i]=='T' && s[i+1]=='R')
        {
            v[cnt++]='1';
            i+=3;
            continue;
        }
        if (s[i]=='F' && s[i+1]=='A')
        {
            v[cnt++]='0';
            i+=4;
            continue;
        }
        if (s[i]=='(' || s[i]==')')
        {
            v[cnt++]=s[i];
            continue;
        }
        v[cnt++]=s[i];
    }
}

//aici incepe cancerul

int OR(),AND(),XOR(),finalizare();

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

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

int XOR()
{
    int r=finalizare();
    while (v[i]=='!')
    {
        i++;
        r=(r ^ finalizare());
    }
    return r;
}

int finalizare()
{
    int r=0;
    if (v[i]=='(')
    {
        i++;
        r=OR();
        i++;
    } else {
        if (v[i]=='1')
        {
            i++;
            return 1;
        }
        else if (v[i]=='0')
            {
                i++;
                return 0;
            }
        return val[v[i++]];
    }
    return r;
}

int main()
{
    fin.getline(s,1001);
    normalizare();

    fin >> n;
    for (int j=1;j<=n;j++)
    {
        char x;
        fin >> x;
        val[x]=1-val[x];
        i=0;
        fout << OR();
    }

    return 0;
}