Cod sursa(job #2572290)

Utilizator Andy_ANDYSlatinaru Andrei Alexandru Andy_ANDY Data 5 martie 2020 12:23:41
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ( "bool.in" );
ofstream g ( "bool.out");

string a,expresie,s;
int p;
int n;
int fr[300];
bool eval();
bool si()
{   bool r,inv=0;
    while(expresie[p]=='~')
    {   inv=1-inv;
        ++p;
    }
    if(expresie[p]=='t')
    {
        r=1;
        ++p;
        if(inv) return !r;
        return r;
    }
    if( expresie[p]=='f' )
    {
        r=0;
        ++p;
        if(inv) return !r;
        return r;
    }
    if(expresie[p]=='(')
    {
        ++p;
        r=eval();
        ++p;
        if(inv) return !r;
        return r;
    }
    if( 'A'<=expresie[p] and expresie[p]<='Z')
    {
        r=fr[expresie[p]];
        ++p;
        if(inv) return !r;
        return r;
    }
}

bool sau()
{
    bool r=si();
    while(expresie[p]=='&')
    {
        ++p;
        r&=si();
    }
    return r;
}


bool eval()
{
    bool r=sau();
    while(expresie[p]=='|')
    {   ++p;
        r|=sau();
    }
    return r;
}
void form()
{
    for(int i=0;i<a.size();i++)
        n=n*10+a[i]-'0';
}
int main()
{
    while(f>>a)
    {   if( '0'<=a[0] and a[0]<='9') break;
        s+=a;
    }
    for(int i=0;i<s.size();i++)
    {   if(s[i]==' ') continue;
        else if(s[i]=='A' and s[i+1]=='N') expresie+='&',i+=2;
        else if(s[i]=='O' and s[i+1]=='R') expresie+='|',i++;
        else if(s[i]=='N' and s[i+1]=='O') expresie+='~',i+=2;
        else if(s[i]=='T' and s[i+1]=='R') expresie+='t',i+=3;
        else if(s[i]=='F' and s[i+1]=='A') expresie+='f',i+=4;
        else expresie+=s[i];
    }
    form();
    for(int i=1;i<=n;i++)
    {
        char x;
        f>>x;
        fr[x]=!fr[x];
        p=0;
        g<<eval();
    }
    return 0;
}