Cod sursa(job #2956556)

Utilizator lucaxsofLuca Sofronie lucaxsof Data 19 decembrie 2022 19:06:17
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 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();     //  )|(   
bool factor();     //not  true false

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 = factor();
    while (s[p] == '&' || s[p] == '|')
    {
        if (s[p] == '&')
        {
            p++;
            rez &= factor();
        }
        else
        {
            p++;
            rez |= factor();
        }
    }
    return rez;
}

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
    }
    if (s[p] == '0' || s[p] == '1')
        return semn == 1 ? s[p] - '0' : !(s[p] - '0');
    return semn == 1 ? value[s[p] - 'A'] : !(value[s[p] - 'A']);
}

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

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