Cod sursa(job #3142619)

Utilizator AlexandruDrg23Draghici Alexandru AlexandruDrg23 Data 22 iulie 2023 21:23:50
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool v[30];
char s[1010];
char *p;

ifstream fin ("bool.in");
ofstream fout ("bool.out");

bool eor()
{
    if(*p=='O' && *(p+1)=='R')
    {
        p++;
        p++;
        if(*p==' ')
            p++;
        return true;
    }
    return false;
}

bool eval();
bool si();
bool sau()
{
    bool test=true;
    if(*p==' ')
        p++;
    bool r=false;
    if(*p==' ')
        p++;
    if(*p=='N' && *(p+1)=='O' && *(p+2)=='T')
    {
        while(*p=='N' && *(p+1)=='O' && *(p+2)=='T')
        {
            p++;
            p++;
            p++;
            p++;
            test=!test;
        }
    }
    if(test==false)
    {
        if(*p=='(')
        {
            p++;
            r=!eval();
            p++;
        }
        else
            return (!v[*(p-1)-'A']);
    }
    else
        if(*p=='(')
        {
            p++;
            r=eval();
            p++;
        }
        else
        {
            p++;
            return (v[*(p-1)-'A']);
        }
    return r;
}

bool eval()
{
    if(*p==' ')
        p++;
    bool r=si();
    if(*p==' ')
        p++;
    while(eor())
    {
        if(*p=='N' && *(p+1)=='O' && *(p+2)=='T')
        {
            p++;
            p++;
            p++;
            p++;
            r=(r||!si()?true:false);
        }
        else
            r=(r||si()?true:false);
    }
   /// cout<<r<<endl;
    return r;
}

bool si()
{
    if(*p==' ')
        p++;
    bool r=sau();
    if(*p==' ')
        p++;
    while(*p=='A' && *(p+1)=='N' && *(p+2)=='D')
    {
        p++;
        p++;
        p++;
        p++;
        if(*p=='N' && *(p+1)=='O' && *(p+2)=='T')
        {
            p++;
            p++;
            p++;
            r=(r && !sau()?true:false);
        }
        else
            r=(r && sau()?true:false);
    }
   /// cout<<r<<endl;
    return r;

}

int main()
{
    fin.getline(s,1000);
    int n;
    fin>>n;
    char a;
    for(int k=1;k<=n;k++)
    {
        fin>>a;
        v[a-'A']=!v[a-'A'];
        p=s;
        fout<<eval();
    }
    return 0;
}