Cod sursa(job #2376584)

Utilizator Vlad_NituNitu Vlad-Petru Vlad_Nitu Data 8 martie 2019 16:30:28
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("bool.in") ;
ofstream g ("bool.out");
int N ;
char v[105] ,c,  s[105] ;
int fv[35] ;
int i  = 0 , k = -1, cnt = 0;
int eval() ;
int termen() ;
int factor();
void prelucrare()
{
    for (int i = 0 ; i < cnt ; ++i)
    {
        if (v[i]== ' ') i ++ ;
        if (isupper(v[i]) && !isalpha(v[i-1]) && !isalpha(v[i+1]) || v[i] == '(' || v[i] == ')')
        {
            s[++k] = v[i];

        }
        else{
        if (v[i] == 'A' && v[i+1] == 'N' && v[i+2] == 'D')
        {

            s[++k] = '&';
        }
        if (v[i] =='O' && v[i+1] == 'R')
        {

            s[++k] = '|';
        }
        if (v[i] == 'N' && v[i+1] == 'O' && v[i+2] == 'T')
        {

            s[++k] = '!' ;
        }
        if (v[i] == 'T' && v[i+1] == 'R' && v[i+2] == 'U' && v[i+3] == 'E')
        {

            s[++k] = '1';
        }
        if (v[i] == 'F' && v[i+1] == 'A' && v[i+2] == 'L' && v[i+3] == 'S' && v[i+4] == 'E')
        {

            s[++k] = '0';
        }
        }


    }
}

int eval()
{
    int r = termen();
    while (s[i] == '|')
    {
        i ++ ;
        r = (r | termen());
    }
    return r;
}
int termen()
{
    int r = factor();
    while (s[i] == '&')
    {
        i ++ ;
        r = (r & factor()) ;
    }
    return r;
}
int factor()
{
    int r = 0 ;
    if (s[i] == '(')
    {
        i ++ ;
        r = eval() ;
        i ++ ;
    }
            else
            {
                if (s[i] == '!') i ++ , r = 1 -factor() ;

            else if (s[i] == '1')r = 1 , i ++;
            else if (s[i] == '0')r = 0 , i ++ ;
            else if (isupper(s[i])) r = fv[s[i]-'A'] , i++ ;
            }
    return r;
}
int main()
{
    f.getline(v,102) ;
    i = 0 ;
    cnt = strlen(v);

    prelucrare();

     k ++ ;

        f >> N ;
    for (int query = 1 ; query <= N ; ++ query)
    {
            f >> c;
            i = 0 ;
            fv[c-'A'] = 1 - fv[c-'A'];
           g << eval();
    }
}