Cod sursa(job #3210419)

Utilizator Ionut2212Nedelcu Alexandru Ionut Ionut2212 Data 6 martie 2024 11:25:28
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 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, k, 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];
        }
        else
        {
            r = (int)t[i] - '0';
        }
    }
    return r;
}

int main()
{
    fin.get(s,1001);
    n = strlen(s);
    for (i=0; s[i]!=0; i++)
    {
        if (s[i] == ' ')
            continue;
        if (s[i] == '(' || s[i] == ')')
        {
            t[k++] = s[i];
            continue;
        }
        if (s[i] == 'T' && s[i+1] == 'R')
        {
            t[k++] = '1';
            i+=3;
            continue;
        }
        if (s[i]== 'F' && s[i+1] == 'A')
        {
            t[k++] = '0';
            i+=4;
            continue;
        }
        if (s[i] == 'O' && s[i+1] == 'R')
        {
            t[k++] = '|';
            i++;
            continue;
        }
        if (s[i]=='A' && s[i+1] == 'N')
        {
            t[k++] = '&';
            i+=2;
            continue;
        }
        if (s[i] == 'N' && s[i+1] == 'O')
        {
            t[k++] = '1';
            t[k++] = '^';
            i+=2;
            continue;
        }
        t[k++] = s[i];
    }
    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;
}