Cod sursa(job #2332625)

Utilizator corvinus2003Corvin Ghita corvinus2003 Data 30 ianuarie 2019 21:59:29
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 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)
    {
        in>>c;
        v[c-'A']=!v[c-'A'];
        bool raspuns=expresie();
        out<<raspuns;
    }
    return 0;
}