Cod sursa(job #2359665)

Utilizator trifangrobertRobert Trifan trifangrobert Data 28 februarie 2019 23:19:12
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

const int NMAX = 1005;
const int SIGMA = 26;
int n, m, p;
char aux[NMAX], s[NMAX], lit[NMAX];
bool val[SIGMA + 5];
bool expresie(), termen(), factor();

inline bool CheckTrue()
{
    return (s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E');
}

inline bool CheckFalse()
{
    return (s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E');
}

inline bool CheckNot()
{
    return (s[p] == 'N' && s[p + 1] == 'O' && s[p + 2] == 'T');
}

inline bool CheckAnd()
{
    return (s[p] == 'A' && s[p + 1] == 'N' && s[p + 2] == 'D');
}

inline bool CheckOr()
{
    return (s[p] == 'O' && s[p + 1] == 'R');
}

bool expresie()
{
    bool x = termen();
    while (CheckOr())
    {
        p += 2;
        x = x | termen();
    }
    return x;
}

bool termen()
{
    int x = factor();
    while (CheckAnd())
    {
        p += 3;
        x = x & factor();
    }
    return x;
}

bool factor()
{
    bool x = 0;
    if (s[p] == '(')
    {
        ++p;
        x = expresie();
        ++p;
    }
    else if (CheckNot())
    {
        p += 3;
        x = 1 - factor();
    }
    else if (CheckTrue())
    {
        p += 4;
        x = 1;
    }
    else if (CheckFalse())
    {
        p += 5;
        x = 0;
    }
    else
    {
        x = val[s[p] - 'A'];
        ++p;
    }
    return x;
}

int main()
{
    ifstream fin("bool.in");
    ofstream fout("bool.out");
    fin.getline(aux + 1, NMAX);
    n = 0;
    for (int i = 1;aux[i];++i)
        if (aux[i] != ' ')
            s[++n] = aux[i];
    fin >> m;
    fin.get();
    fin.getline(lit + 1, NMAX);
    string ans;
    for (int i = 1;i <= m;++i)
    {
        val[lit[i] - 'A'] = !val[lit[i] - 'A'];
        p = 1;
        ans.push_back((char)(expresie() + '0'));
    }
    fout << ans << "\n";
    fin.close();
    fout.close();
    return 0;
}