Cod sursa(job #2327609)

Utilizator Iorgus08Iorgus Serghei Cicala Iorgus08 Data 24 ianuarie 2019 19:36:33
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N=1e3+1;

char s[N];
char v[N];
bool val1[N];
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=-x;
    }
    if(v[p]=='(')
    {
        p++;
        val=expresie();
        p++;
        if(x)
            return !val;
        return val;
    }
    p++;
    if((v[p-1]=='0'||v[p-1]=='1')&&x)
        return !(v[p-1]-'0');
    if(v[p-1]=='0'||v[p-1]=='1')
        return v[p-1]-'0';
    if(x)
        return !val1[v[p-1]-'A'];
    return val1[v[p-1]-'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[1]=='O'&&s[2]=='R')
            v[++cnt]='|';
        else if(s[2]=='N'&&s[1]=='A')
            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+=4;
            }
            else if(s[poz+1]=='O')
                v[++cnt]='!';
            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;
}