Cod sursa(job #1122825)

Utilizator thewildnathNathan Wildenberg thewildnath Data 25 februarie 2014 20:40:43
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include<stdio.h>
#include<string.h>

#define LMAX 1012

int i,lung;
char sir[LMAX];
int val[30];

// Semne: OR 0, AND 2



bool calc();

inline void ignore()
{
    while(sir[i]==' ')
        ++i;
}

inline int get_type()
{
    ignore();

    switch(sir[i])
    {
        case 'O':{i+=2;return 0;}
        case 'A':{i+=3;return 1;}
    }
}
inline int get_num()
{
    int rez=0,ok=0;
    ignore();

    while(sir[i]=='N'&&sir[i+1]=='O')
    {
        i+=4;
        ok=1-ok;
    }

    if(sir[i]=='T'&&sir[i+1]=='R')
    {
        i+=4;
        rez=1;
    }else if(sir[i]=='F'&&sir[i+1]=='A')
    {
        i+=5;
        rez=0;
    }
    else switch(sir[i])
    {
        case '(':{++i;rez=calc();break;}
        default  :{++i;rez=val[sir[i-1]-'A'];break;}
    }

    if(ok)
        return 1-rez;
    return rez;
}

bool calc()
{
    bool a,b,c,s1,s2;
    a=b=c=s1=s2=0;

    c=get_num();
    if(sir[i]==')')
    {
        ++i;
        return c;
    }
    for(;i<lung;)
    {
        if(s2==0){
            switch(s1)
            {
                case 0:{a=a|b;break;}
                case 1:{a=a&b;break;}
            }
            b=c;
            s1=s2;
        }else if(s2==1){
            b=b&c;
        }

        if(sir[i]==')')
        {
            s2=0;
            c=0;
            ++i;
            break;
        }

        ignore();

        s2=get_type();
        ignore();

        c=get_num();


    }


                                            // FINISH
    if(s2==0){
        switch(s1)
        {
            case 0:{a=a|b;break;}
            case 1:{a=a&b;break;}
        }
        b=c;
        s1=s2;
    }else if(s2==1){
        b=b&c;
    }

    switch(s1)
    {
        case 0:{a=a|b;break;}
        case 1:{a=a&b;break;}
    }

    return a;
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    int n,rez;
    char c;

    gets(sir);
    lung=strlen(sir);
    scanf("%d\n",&n);

    while(scanf("%c",&c))
    {

        if(c<'A'||c>'Z')
            break;

        val[c-'A']=1-val[c-'A'];
        i=0;

        rez=calc();

        printf("%d",rez);
    }

    printf("\n");

    return 0;
}