Cod sursa(job #1897177)

Utilizator GoogalAbabei Daniel Googal Data 1 martie 2017 11:08:22
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <cstring>
#define nm 1001

using namespace std;

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

int n,p;
bool alp[30];
char v[nm],x;
string s;

bool solve();
bool termen();
bool fact();

bool fact()
{
    bool x;
    if(s[p]=='!')
    {
        p++;
        return !fact();
    }
    else if(s[p]=='1')
    {
        p++;
        return true;
    }
    else if(s[p]=='0')
    {
        p++;
        return false;
    }
    else if(s[p]=='(')
    {
        p++;
        x=solve();
        p++;
    }
    else
    {
        x=alp[s[p]-'A'];
        p++;
    }
    return x;
}

bool termen()
{
    bool x=fact();
    while(s[p]=='&')
    {
        p++;
        x&=fact();
    }
    return x;
}

bool solve()
{
    bool x=termen();
    while(s[p]=='|')
    {
        p++;
        x|=termen();
    }
    return x;
}

int main()
{
    int i,l;
    fin.getline(v,nm);
    l=strlen(v);
    for(i=0; i<l; i++)
    {
        if(v[i]=='A' && v[i+1]=='N')
            s+='&',i+=2;
        else if(v[i]=='O' && v[i+1]=='R')
            s+='|',i++;
        else if(v[i]=='N' && v[i+1]=='O')
            s+='!',i+=2;
        else if(v[i]=='F' && v[i+1]=='A')
            s+='0',i+=4;
        else if(v[i]=='T' && v[i+1]=='R')
            s+='1',i+=3;
        else if(isalpha(v[i]) || v[i]=='(' || v[i]==')')
            s+=v[i];
    }
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        alp[x-'A']=!alp[x-'A'];
        p=0;
        fout<<solve();
    }
    fin.close();
    fout.close();
    return 0;
}