Cod sursa(job #1948223)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 31 martie 2017 21:22:32
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int n,m,i,f[102],k,j;
char s[1002],v[1002],x;

int exprOR();
int exprAND();
int exprXOR();
int factor();

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

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

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

int factor()
{
    int r = 0;
    if (v[i] == '(')
    {
        i++;
        r = exprOR();
        i++;
    }
    else
    {
        if (v[i] == '1')
        {
            i++;
            return 1;
        }
        if (v[i] =='0')
        {
            i++;
            return 0;
        }
        i++;
        return f[v[i-1]];
    }
    return r;
}

int main()
{
    fin.getline (s, 1002);
    m = strlen (s);
    for (i=0; i<m; i++)
    {
        if (s[i] == ' ')
            continue;
        if (s[i] == 'O' && s[i+1] == 'R')
        {
            v[k] = '|';
            k++;
            i++;
            continue;
        }
        if (s[i]=='A' && s[i+1] == 'N')
        {
            v[k] = '&';
            k++;
            i += 2;
            continue;
        }
        if (s[i] == 'N' && s[i+1] == 'O')
        {
            v[k] = '1';
            k++;
            v[k] = '^';
            k++;
            i += 2;
            continue;
        }
        if (s[i] == 'T' && s[i+1] == 'R')
        {
            v[k] = '1';
            k++;
            i += 3;
            continue;
        }
        if (s[i]== 'F' && s[i+1] == 'A')
        {
            v[k] = '0';
            k++;
            i += 4;
            continue;
        }
        if (s[i] == '(' || s[i] == ')')
        {
            v[k] = s[i];
            k++;
            continue;
        }
        v[k] = s[i];
        k++;
    }
    fin >> n;
    for (j=1; j<=n; j++)
    {
        fin >> x;
        f[x] = 1-f[x];
        i = 0;
        fout << exprOR ();
    }
    return 0;
}