Cod sursa(job #2320312)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 14 ianuarie 2019 17:08:00
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
char s[1001];
char v[1001];
bool val1[26];

int p=1;

int expresie();
int termen();
int factor();

int expresie()
{
    int sum=termen();
    while(v[p]=='|')
    {
        p++;
        sum=sum|termen();
    }
    return sum;
}

int termen()
{
    int val=factor();
    while(v[p]=='&')
    {
        p++;
        val=val&factor();
    }
    return val;
}

int factor()
{
    int val=0,x=0;
    while(v[p]=='!')
    {
        p++;
        x=1;
    }
    if(v[p]=='(')
    {
        p++;
        val=expresie();
        p++;
        if(x)
        return !val;
        return val;
    }
    if(v[p]=='0'||v[p]=='1'&&x)
        return !(v[p]-'0');
    if(v[p]=='0'||v[p]=='1')
        return v[p]-'0';
    if(x)
    return !val1[v[p]-'A'];
    return val1[v[p]-'A'];
}
int main()
{
    int cnt=0,poz,n=0,i,x;
    in>>(s+1);
    while(s[1]<'0'||s[1]>'9')
    {
        if(strlen(s+1)==1)
            v[++cnt]=s[1];
        else if(s[2]=='O')
            v[++cnt]='!';
        else if(s[1]=='O'&&s[2]=='R')
            v[++cnt]='|';
        else if(s[2]=='N')
            v[++cnt]='&';
        else
        {
            poz=1;
            while(s[poz]=='('&&s[poz]!=' ')
            {
                v[++cnt]='(';
                poz++;
            }
            if(s[poz+1]=='R')
            {
                v[++cnt]='1';
                poz+=4;
            }
            else if(s[poz+1]=='A')
            {
                v[++cnt]='0';
                poz+=5;
            }
            else
            {
                v[++cnt]=s[poz];
                poz++;
            }
            while(s[poz]==')'&&s[poz]!=' ')
            {
                v[++cnt]=')';
                poz++;
            }
        }
        in>>(s+1);
    }
    x=strlen(s+1);
    for(int i=1; i<=x; i++)
        n=n*10+s[i]-'0';
    in>>s;
    for(i=0; i<n; i++)
    {
        val1[s[i]-'A']=1-val1[s[i]-'A'];
        p=1;
        out<<expresie();
    }
    return 0;
}