Cod sursa(job #2918179)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 10 august 2022 13:30:27
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
#define nmax 101
using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

string in,p,ch;
int n;

void parse()
{
    int i=0;
    while(i<in.size())
    {
        string l5=in.substr(i,5);
        string l4=in.substr(i,4);
        string l3=in.substr(i,3);
        string l2=in.substr(i,2);
        if(l4=="TRUE")
        {
            p.push_back('1');
            i+=4;
        }
        else if(l5=="FALSE")
        {
            p.push_back('0');
            i+=5;
        }
        else if(l3=="AND")
        {
            p.push_back('&');
            i+=3;
        }
        else if(l3=="NOT")
        {
            p.push_back('!');
            i+=3;
        }
        else if(l2=="OR")
        {
            p.push_back('|');
            i+=2;
        }
        else if((in[i]>='A'&&in[i]<='Z')||in[i]=='('||in[i]==')')
        {
            p.push_back(in[i]);
            i++;
        }
        else
        {
            i++;
        }
        //cout<<i<<' '<<p<<' '<<in.size()<<'\n';
    }
}

bool evalNot();
bool evalOr();
bool evalAnd();
bool evalVar();


int pt=0;
bool val[27];
bool evalOr()
{
    bool a=evalAnd();
    if(p[pt]=='|')
    {
        pt++;
        bool b=evalAnd();
        return a|b;
    }
    return a;
}

bool evalAnd()
{
    bool a=evalNot();
    if(p[pt]=='&')
    {
        pt++;
        bool b=evalNot();
        return a&b;
    }
    return a;
}

bool evalNot()
{
    if(p[pt]=='!')
    {
        pt++;
        return !evalVar();
    }
    return evalVar();
}

bool evalVar()
{
    if(p[pt]=='(')
    {
        pt++;
        bool a=evalOr();
        pt++; //paranteza inchisa;
        return a;
    }
    if(p[pt]=='1') {pt++;return 1;}
    if(p[pt]=='0') {pt++; return 0;}
    bool a=val[p[pt]-'A'];
    pt++;
    return a;
}


int main()
{
    getline(f,in);
    parse();

    //g<<p<<'\n';
    f>>n>>ch;
    for(int i=0;i<n;i++)
    {
        val[ch[i]-'A']^=1;
        pt=0;
        g<<evalOr();
    }


    return 0;
}