Cod sursa(job #3192766)

Utilizator lucatanasegLuca-Tanase Grindean lucatanaseg Data 13 ianuarie 2024 11:04:03
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

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

map<char,bool>ma;

string s;
char p[1005];
int pos;

void create()
{
    int i=0;
    int l= strlen(p);
    while(i<l)
    {

        if(p[i]=='T' && p[i+1]=='R')
        {
            s.push_back('1');
            i+=4;
        }
        else if(p[i]=='F' && p[i+1]=='A')
        {
            s.push_back('0');
            i+=5;
        }
        else if(p[i]=='N' && p[i+1]=='O')
        {
            s.push_back('!');
            i+=3;
        }
        else if(p[i]=='A' && p[i+1]=='N')
        {
            s.push_back('&');
            i+=3;
        }
        else if(p[i]=='O' && p[i+1]=='R')
        {
            s.push_back('|');
            i+=2;
        }
        else if(p[i]=='(' || p[i]==')')
        {
            s.push_back(p[i]);
            i++;
        }
        else if(p[i]>='A' && p[i]<='Z')
         {
            s.push_back(p[i]);
            i++;
         }
        else if(p[i]==' ')
            i++;
    }
}

bool OR();
bool AND();
bool exp();

bool OR()
{
    bool t = AND();
    while(s[pos]=='|')
    {
        pos++;
        bool p = AND();
        t = (p || t);
    }
    return t;
}

bool AND()
{
    bool t = exp();
    while(s[pos]=='&')
        {
            pos++;
            bool p = exp();
            t = (p && t);
        }
    return t;
}

bool exp()
{
    bool res = 0;
    if(s[pos]=='(')
    {
        pos++;
        res = OR();
        pos++;
    }
    else if(s[pos]=='!')
    {
        pos++;
        res = !exp();
    }
    else
    {
        if(s[pos]=='1' || s[pos]=='0')
            res=s[pos]-'0';
        else
            res=ma[s[pos]];
        pos++;
    }
    return res;
}

int main()
{
    fin.getline(p,1005);
    create();
    int n;
    fin>>n;
    for(int i=0;i<n;i++)
    {
        pos = 0;
        char X;
        fin>>X;
        ma[X]=!ma[X];
        fout<<OR();
    }
    return 0;
}