Cod sursa(job #2523582)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 14 ianuarie 2020 13:51:35
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
#define ff first
#define ss second

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;

const string file = "bool";
const ll INF = 9223372036854775807ll;
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, inf = 2147483647;

int val[257], p;

bool check_and(string &s)
{
    if (p >= s.length())
        return false;
    if (s[p] == ' ')
        ++p;
    return p+2 < s.length() && s[p] == 'A' && s[p+1] == 'N' && s[p+2] == 'D';
}

bool check_or(string &s)
{
    if (p >= s.length())
        return false;
    if (s[p] == ' ')
        ++p;
    return p+1 < s.length() && s[p] == 'O' && s[p+1] == 'R';
}

bool and_eval(string&);

bool or_eval(string &s)
{
    bool and_elem = and_eval(s);
    while (true){
        if (!check_or(s))
            break;
        p += 2;
        and_elem |= and_eval(s);
    }
    return and_elem;
}

bool element(string&);

bool and_eval(string &s)
{
    bool elem = element(s);
    while (true){
        if (!check_and(s))
            break;
        p += 3;
        elem &= element(s);
    }
    return elem;
}

bool element(string &s)
{
    bool ret = false;
    if (s[p] == ' ')
        ++p;
    if (p+2 < s.length() && s[p] == 'N' && s[p+1] == 'O' && s[p+2] == 'T'){
        p += 3;
        ret ^= element(s);
    }else if (s[p] == '('){
        ++p;
        ret ^= or_eval(s);
        if (s[p] == ' ')
            ++p;
        ++p;
    }else if (p+3 < s.length() && s[p] == 'T' && s[p+1] == 'R' && s[p+2] == 'U' && s[p+3] == 'E'){
        p += 4;
        ret ^= true;
    }else if (p+4 < s.length() && s[p] == 'F' && s[p+1] == 'A' && s[p+2] == 'L' && s[p+3] == 'S' && s[p+4] == 'E'){
        p += 5;
        ret ^= false;
    }else if (s[p] >= 'A' && s[p] <= 'Z'){
        ++p;
        ret ^= val[s[p-1]];
    }
    return ret;
}

int main()
{
    ifstream fin (file+".in");
    ofstream fout (file+".out");
    string s;
    getline(fin, s);
    int test;
    fin >> test;
    while(test--){
        char q;
        fin >> q;
        val[q] ^= 1;
        p = 0;
        fout << or_eval(s);
    }
    return 0;
}