Cod sursa(job #2327622)

Utilizator CosaMateiMatei Cosa Gabriel CosaMatei Data 24 ianuarie 2019 19:38:47
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N=1001;

char s[N],t[N];

bool v[27];

int k,p,len;

bool expresie();
bool termen();
bool factor();

void rep()
{
    for(int i=0; i<len; ++i)
    {
        if(t[i]=='T'&&t[i+1]=='R')
        {
            s[k++]='1';
            i+=3;
        }
        else if(t[i]=='F'&&t[i+1]=='A')
        {
            s[k++]='0';
            i+=3;
        }
        else if(t[i]=='N'&&t[i+1]=='O')
        {
            s[k++]='!';
            i+=2;
        }
        else if(t[i]=='A'&&t[i+1]=='N')
        {
            s[k++]='&';
            i+=2;
        }
        else if(t[i]=='O'&&t[i+1]=='R')
        {
            s[k++]='|';
            i+=1;
        }
        else if(t[i]!=' ')
        {
            s[k++]=t[i];
        }
    }
}

bool expresie()
{
    bool ans=termen();
    while(s[p]=='|')
    {
        p++;
        ans=(ans||factor());
    }
    return ans;
}

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

bool factor()
{
    bool val,n=false;
    while(s[p]=='!')
    {
        p++;
        n=true;
    }
    if(s[p]=='(')
    {
        p++;
        val=expresie();
        p++;
        if(n)
        {
            return !val;
        }
        else
        {
            return val;
        }
    }
    val=v[s[p]-'A'];
    if(n)
    {
        return !val;
    }
    else
    {
        return val;
    }
    return val;
}

int main()
{
    in.getline(t,1000);
    int x;
    char c;
    in>>x;
    len=strlen(t);
    rep();
    for(int i=0;i<x;++i)
    {
        p=0;
        in>>c;
        v[c-'A']=!v[c-'A'];
        bool raspuns=expresie();
        out<<raspuns;
    }
    return 0;
}