Cod sursa(job #2851071)

Utilizator razvan4974Manole Razvan-Cristian razvan4974 Data 18 februarie 2022 00:57:07
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f ("bool.in");
ofstream g ("bool.out");

char s[1005], c, t[1005], *p;
bool val[30];
int n, i, nr;

bool eval();
bool termen();
bool factor();

void citire()
{
    f.getline(t, 1005);
    f >> n;
    f.get();
}

void tocare()
{
    p = t;
    p = strtok(t, " ");
    while(p)
    {
        strcat(s, p);
        p = strtok(NULL, " ");
    }
}

/*
void despatiere()
{
    int m = strlen(t);
    for (int i = 0; i < m; ++i)
    {
        if (t[i] != ' ') s[nr++]= t[i];
    }
}
*/

bool eval()
{
    bool r = 0;
    r = termen();
    while (s[i] == 'O' && s[i+1] == 'R')
    {
        i += 2;
        r |= termen();
    }
    return r;
}

bool termen()
{
    bool r = 0;
    r = factor();
    while (s[i] == 'A' && s[i+1] == 'N' && s[i+2] == 'D')
    {
        i += 3;
        r &= factor();
    }
    return r;
}

bool factor()
{
    bool r = 0;
    if (s[i] == 'N' && s[i+1] == 'O' && s[i+2] == 'T')
    {
        i += 3;
        r =! factor();
    }
    else if (s[i] == '(')
    {
        ++i;
        r = eval();
        ++i;
    }
    else if (s[i] == 'T' && s[i+1] == 'R' && s[i+2] == 'U' && s[i+3] == 'E')
    {
        i += 4;
        r = true;
    }
    else if (s[i] == 'F' && s[i+1] == 'A' && s[i+2] == 'L' && s[i+3] == 'S' && s[i+4] == 'E')
    {
        i += 5;
        r = false;
    }
    else
    {
        r = val[s[i]-'A'];
        ++i;
    }
    return r;
}

int main()
{
    f.tie(nullptr);
    citire();
    tocare();
    for (int k = 1; k <= n; ++k)
    {
        i = 0;
        f >> c;
        val[c-'A'] = !val[c-'A'];
        g << eval();
    }
    return 0;
}