Cod sursa(job #2952472)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 9 decembrie 2022 12:13:43
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <set>
#import <deque>
#import <queue>
#import <cassert>
//#import <cmath>
#import <cstring>
#import <cctype>
#import <cstdlib>
#import <stack>
using namespace std;
string s;
set<char>mp;
int code(char c)
{
    if(c=='!')return 3;
    if(c=='&')return 2;
    if(c=='|')return 1;
    return 0;
}
int efect(bool x,bool y,char c)
{
    if(c=='&')return (x&y);
    return (x|y);
}
int efect(bool x,char c)
{
    return !x;
}
stack<bool>nr;
stack<char>op;
void calc()
{
    char ch=op.top();
    op.pop();
    if(ch=='!')
    {
        auto a=nr.top();
        nr.pop();
        nr.push(efect(a,ch));
    }
    else
    {
        auto a=nr.top();nr.pop();
        auto b=nr.top();nr.pop();
        nr.push(efect(a,b,ch));
    }
}
int eval(string s)
{
    s='('+s+')';
    int n=(int)s.size()-1;
    for(int i=0;i<=n;i++)
    {
        if(isalpha(s[i]))nr.push(mp.count(s[i]));
        else if(isdigit(s[i]))nr.push(s[i]-'0');
        else if(s[i]=='(')op.push('(');
        else if(s[i]==')')
        {
            while(op.top()!='(')
            {
                calc();
            }
            op.pop();
        }
        else
        {
            while(code(s[i])<=code(op.top()))calc();
            op.push(s[i]);
        }
    }
    return nr.top();
}
main()
{
    ifstream cin("bool.in");
    ofstream cout("bool.out");
    string aux;
    getline(cin,aux);
    int n=(int)aux.size();
    aux.push_back(' ');
    for(int i=0;i<n;i++)
    {
        if(aux[i]=='A' && aux[i+1]=='N')
        {
            s.push_back('&');
            i+=2;
        }
        else if(aux[i]=='O' && aux[i+1]=='R')
        {
            s.push_back('|');
            i++;
        }
        else if(aux[i]=='N' && aux[i+1]=='O')
        {
            s.push_back('!');
            i+=2;
        }
        else if(aux[i]=='T' && aux[i+1]=='R')
        {
            s.push_back('1');
            i+=3;
        }
        else if(aux[i]=='F' && aux[i+1]=='A')
        {
            s.push_back('0');
            i+=4;
        }
        else if(aux[i]!=' ')
        {
            s.push_back(aux[i]);
        }
    }
    //cout<<s<<'\n';
    cin>>n>>aux;
    for(int i=0;i<n;i++)
    {
        if(mp.count(aux[i]))
        {
            mp.erase(aux[i]);
        }
        else
        {
            mp.insert(aux[i]);
        }
        cout<<eval(s);
        //return 0;
    }
}