Cod sursa(job #2956566)

Utilizator lucaxsofLuca Sofronie lucaxsof Data 19 decembrie 2022 19:46:47
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <vector>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
//#include <bits/stdc++.h>
using namespace std;

ifstream cin("bool.in");
ofstream cout("bool.out");

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

const int mod = 1e9 + 7;
const int NMAX = 1e5 + 3;
const double eps = 1e-7;                                                     

string s1, s;

bool value[30];

int p;
bool expresie();     //  )|(   or este un fel de plus dpdv propietate
bool factor();     //not  true false
bool termen();

void preprocess()
{
    int i = 0;
    while (s1[i] != NULL)
    {
        if (s1[i] == 'T' && s1.substr(i + 1, 3) == "RUE")
        {
            s.push_back('1');
            i += 4;
        }
        else if (s1[i] == 'F' && s1.substr(i + 1, 4) == "ALSE")
        {
            s.push_back('0');
            i += 5;
        }
        else if (s1[i] == 'O' and s1[i + 1] == 'R')
        {
            s.push_back('|');
            i += 2;
        }
        else if (s1[i] == 'A' && s1[i + 1] == 'N' && s1[i + 2] == 'D')
        {
            s.push_back('&');
            i += 3;
        }
        else if (s1[i] == 'N' && s1[i + 1] == 'O' && s1[i + 2] == 'T')
        {
            s.push_back('~');
            i += 3;
        }
        else if (s1[i] == '(' || s1[i] == ')')
        {
            s.push_back(s1[i]);
            i++;
        }
        else if ('A' <= s1[i] and s1[i] <= 'Z')
        {
            s.push_back(s1[i]);
            i++;
        }
        else
            i++;
    }
}

void read()
{
    getline(cin, s1);
    preprocess();
}

bool expresie()
{
    bool rez = termen();
    while (s[p] == '|')
    {
        p++;
        rez = (rez || termen());
    }
    return rez;
}

bool termen()
{
    int val = factor();
    while (s[p] == '&')
    {
        p++;
        val = (val && factor());
    }
    return val;
}

bool factor()
{
    bool val = 0, semn = 1;
    while (s[p] == '~')
    {
        p++;
        semn = (!semn);
    }
    if (s[p] == '(')
    {
        p++;
        val = expresie();
        p++;
        return semn == 1 ? val : !val;          //~1 != 0
    }
    char c = s[p];
    if (c == '0')
        val = 0;
    else if (c == '1')
        val = 1;
    else
        val = value[c - 'A'];
    p++;
    return semn ? val : !val;
}

void solve()
{
    int test;
    cin >> test;
    char x;
    while (test)
    {
        test--;
        cin >> x;
        value[x - 'A'] = !(value[x - 'A']);
        p = 0;
        cout << expresie();
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    read();
    solve();
}