Cod sursa(job #3210426)

Utilizator Ionut2212Nedelcu Alexandru Ionut Ionut2212 Data 6 martie 2024 11:28:59
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char s[1001], t[1001], x; int i, n, z = -1, vf;
bool v[30];
int expresiexor();
int expresieand();
int expresieor();
int termen ();
int expresieor()
{
    int r = expresieand();
    while(t[i] == '|')
    {
        i++;
        r = (r | expresieand());
    }
    return r;
}
int expresieand()
{
    int r = expresiexor();
    while(t[i] == '&')
    {
        i++;
        r = (r & expresiexor());
    }
    return r;
}
int expresiexor()
{
    int r = termen();
    while(t[i] == '^')
    {
        i++;
        r = (r^termen());
    }
    return r;
}
int termen()
{
    int r;
    if(t[i] == '(')
    {
        i++;
        r = expresieor();
        i++;
    }
    else
    {
        if(t[i] >= 'A' && t[i] <= 'Z')
        {
            r = (int)v[t[i] - 'A' + 1];
        i++;}
        else
        {
            r = (int)t[i] - '0';
        i++;}
    }
    return r;
}

int main()
{
    fin.get(s,1001);
    n = strlen(s);
    for(int i = 0; i < n; i++)
    {
        if(s[i] == 'A' && s[i+1] == 'N')
        {
            t[++z] = '&';
            i+=2;
        }
        else
        if(s[i] == '(' || s[i] == ')')
        {
            t[++z] = s[i];
        }
        else
        if(s[i] == 'O' && s[i+1] == 'R')
        {
            t[++z] = '|';
            i+=1;
        }
        else
        if(s[i] == 'N' && s[i+1] == 'O')
        {
            t[++z] = '1';
            t[++z] = '^';
            i+=2;
        }
        else
        if((s[i] == 'T' && s[i+1] != ' ') || (s[i] == 'F' && s[i+1]!= ' '))
        {

            if(s[i] == 'T' && s[i+1] == 'R')
            {
                t[++z] = '1';i+=3;
            }else
            if(s[i] == 'F' && s[i+1] == 'A')

            {
                t[++z] = '0'; i+=4;
            }
        }
        else
        if(s[i] >= 'A' && s[i] <='Z')
        {
            t[++z] = s[i];
        }

    }
    t[z+1] = NULL;

    fin >> n;
    for(int j = 1; j<=n; j++)
    {
        i = 0;
        fin >> x;
        v[(int)x-'A'+1] = 1- v[(int)x-'A'+1];
        fout << expresieor();
    }
    return 0;
}