Cod sursa(job #1307105)

Utilizator refugiatBoni Daniel Stefan refugiat Data 1 ianuarie 2015 09:09:23
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 8.27 kb
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<bitset>
#include<string>
using namespace std;
bitset<26> v;
string e;
int i,x;
bool parant()
{
    ++i;
    bool b;
    if(e[i]=='!')
    {
        ++i;
        if(e[i]!='(')
        {
            if(e[i]=='1')
                b=0;
            else
                if(e[i]=='0')
                    b=1;
                else
                    b=!v[e[i]-'A'];
            ++i;
        }
        else
            b=!parant();
    }
    else
        if(e[i]!='(')
        {
            if(e[i]=='1')
                b=1;
            else
                if(e[i]=='0')
                    b=0;
                else
                    b=v[e[i]-'A'];
            ++i;
        }
        else
            b=parant();
    if(e[i]==')')
    {
        ++i;
        return b;
    }
    char o1;
    o1=e[i];
    ++i;
    bool c;
    if(e[i]=='!')
    {
        ++i;
        if(e[i]!='(')
        {
            if(e[i]=='1')
                c=0;
            else
                if(e[i]=='0')
                    c=1;
                else
                    c=!v[e[i]-'A'];
            ++i;
        }
        else
            c=!parant();
    }
    else
        if(e[i]!='(')
        {
            if(e[i]=='1')
                c=1;
            else
                if(e[i]=='0')
                    c=0;
                else
                    c=v[e[i]-'A'];
            ++i;
        }
        else
            c=parant();
    bool d;
    char o2;
    for(;e[i]!=')';)
    {
        o2=e[i];
        ++i;
        if(e[i]=='!')
        {
            ++i;
            if(e[i]!='(')
            {
                if(e[i]=='1')
                    d=0;
                else
                    if(e[i]=='0')
                        d=1;
                    else
                        d=!v[e[i]-'A'];
                    ++i;
                }
            else
                d=!parant();
        }
        else
            if(e[i]!='(')
            {
                if(e[i]=='1')
                    d=1;
                else
                    if(e[i]=='0')
                        d=0;
                    else
                        d=v[e[i]-'A'];
                ++i;
            }
            else
                d=parant();
        if(o1=='&')
        {
            b=b&&c;
            o1=o2;
            c=d;
        }
        else
        {
            if(o2=='&')
            {
                c=c&&d;
            }
            else
            {
                b=b||c;
                o1=o2;
                c=d;
            }
        }
    }
    if(o1=='&')
        b=b&&c;
    else
        b=b||c;
    ++i;
    return b;
}
int main()
{
    FILE* si=fopen("bool.in","r");

    FILE* so=fopen("bool.out","w");
    char a;
    string s="";
    while(1)
    {
        fscanf(si,"%c",&a);
        if(a==10)   break;
        else
        {
            if(a!=' '&&a!='('&&a!=')') s=s+a;
            else
            {
                if(a==' ')
                {
                    if(s!="")
                    if(s=="TRUE")     e=e+'1';
                    else if(s=="FALSE")    e=e+'0';
                          else if(s=="AND")  e=e+'&';
                               else if(s=="OR")   e=e+'|';
                                    else if(s=="NOT")   e=e+'!';
                                         else
                                         {
                                             a=s[0];
                                             e=e+a;
                                         }
                    s="";
                }
                else
                    if(a=='(')e=e+'(';
                    else
                    {
                        if(s!="")
                        if(s=="TRUE")     e=e+'1';
                        else if(s=="FALSE")    e=e+'0';
                             else if(s=="AND")  e=e+'&';
                                  else if(s=="OR")   e=e+'|';
                                       else if(s=="NOT")   e=e+'!';
                                            else
                                            {
                                                a=s[0];
                                                e=e+a;
                                            }
                        s="";
                        e=e+')';
                    }
            }
        }
    }
    if(s!="")
    if(s=="TRUE")     e=e+'1';
    else if(s=="FALSE")    e=e+'0';
         else if(s=="AND")  e=e+'&';
              else if(s=="OR")   e=e+'|';
                   else if(s=="NOT")   e=e+'!';
                        else
                        {
                            a=s[0];
                            e=e+a;
                        }
    ///................................
    int n;
    fscanf(si,"%i%*c",&n);
    x=e.length();
    while(n--)
    {
        fscanf(si,"%c",&a);
        if(v[a-'A']==0)
            v[a-'A']=1;
        else
            v[a-'A']=0;
        bool b;
        i=0;
        if(e[i]=='!')
        {
            ++i;
            if(e[i]!='(')
            {
                if(e[i]=='1')
                    b=0;
                else
                    if(e[i]=='0')
                        b=1;
                    else
                        b=!v[e[i]-'A'];
                ++i;
            }
            else
                b=!parant();
        }
        else
            if(e[i]!='(')
            {
                if(e[i]=='1')
                    b=1;
                else
                    if(e[i]=='0')
                        b=0;
                    else
                        b=v[e[i]-'A'];
                ++i;
            }
            else
                b=parant();
        char o1;
        if(i<x)
        {


        o1=e[i];
        bool c;
        ++i;

        if(e[i]=='!')
        {
            ++i;
            if(e[i]!='(')
            {
                if(e[i]=='1')
                    c=0;
                else
                    if(e[i]=='0')
                        c=1;
                    else
                        c=!v[e[i]-'A'];
                ++i;
            }
            else
                c=!parant();
        }
        else
            if(e[i]!='(')
            {
                if(e[i]=='1')
                    c=1;
                else
                    if(e[i]=='0')
                        c=0;
                    else
                        c=v[e[i]-'A'];
                ++i;
            }
            else
                c=parant();
        bool d;
        char o2;
        for(;i<x;)
        {
            o2=e[i];
            ++i;
            if(e[i]=='!')
            {
                ++i;
                if(e[i]!='(')
                {
                    if(e[i]=='1')
                        d=0;
                    else
                        if(e[i]=='0')
                            d=1;
                        else
                            d=!v[e[i]-'A'];
                        ++i;
                    }
                else
                    d=!parant();
            }
            else
                if(e[i]!='(')
                {
                    if(e[i]=='1')
                        d=1;
                    else
                        if(e[i]=='0')
                            d=0;
                        else
                            d=v[e[i]-'A'];
                    ++i;
                }
                else
                    d=parant();
            if(o1=='&')
            {
                b=b&&c;
                o1=o2;
                c=d;
            }
            else
            {
                if(o2=='&')
                {
                    c=c&&d;
                }
                else
                {
                    b=b||c;
                    o1=o2;
                    c=d;
                }
            }
        }
        if(o1=='&')
            b=b&&c;
        else
            b=b||c;
        }
        if(b)
            fprintf(so,"1");
        else
            fprintf(so,"0");
    }
}