Cod sursa(job #3142722)

Utilizator AlexandruDrg23Draghici Alexandru AlexandruDrg23 Data 23 iulie 2023 19:05:24
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

ifstream fin ("bool.in");
ofstream fout ("bool.out");
char s1[1010];
char s[1010];
char *p;
bool v[30];

bool eval();
bool si();
bool sau();

bool sau()
{
    bool r;
    if(*p=='!')
    {
        p++;
        r=!sau();
    }
    if(*p=='(')
    {
        p++;
        r=eval();
        p++;
    }
    if(isalnum(*p))
    {
        if(*p=='1')
            r=true;
        if(*p=='0')
            r=false;
        if(isalpha(*p))
            r=v[*p-'A'];
        p++;
    }
    return r;
}

bool si()
{
    bool r=sau();
    while(*p=='&')
    {
        p++;
        if(*p=='!')
        {
            p++;
            r=r&!sau();
        }
        else
        {
            r=r&sau();
        }
    }
    return r;
}

bool eval()
{
    bool r=si();
    while(*p=='|')
    {
        p++;
        if(*p=='!')
        {
            p++;
            r=r|!si();
        }
        else
        {
            r=r|si();
        }
    }
    return r;
}

int main()
{
    int n;
    fin.getline(s1,1010);
    fin>>n;
    char a;
    int r=0;
    p=s1;
    while(*p!='\000')
    {
        if(isalpha(*(p)) && !isalpha(*(p-1)) && !isalpha(*(p+1)))
        {
            s[r++]=*p;
            p++;
        }
        if(*p==' ')
            p++;
        if(*p==')')
        {
            p++;
            s[r++]=')';
        }
        if(*p=='(')
        {
            p++;
            s[r++]='(';
        }
        if(*p=='A' && *(p+1)=='N')
        {
            s[r++]='&';
            p=p+4;
        }
        if(*p=='O' && *(p+1)=='R')
        {
            s[r++]='|';
            p=p+3;
        }
        if(*p=='T' && *(p+1)=='R')
        {
            s[r++]='1';
            p=p+4;
        }
        if(*p=='F' && *(p+1)=='A')
        {
            s[r++]='0';
            p=p+5;
        }
        if(*p=='N' && *(p+1)=='O')
        {
            s[r++]='!';
            p=p+4;
        }
    }
    for(int k=1;k<=n;k++)
    {
        fin>>a;
        p=s;
        v[a-'A']=!v[a-'A'];
        fout<<eval();
    }
    return 0;
}