Cod sursa(job #627372)

Utilizator crazzytudTudor Popa crazzytud Data 29 octombrie 2011 18:01:27
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<stdio.h>

bool expresie();
bool termen();
bool operat();
bool non();
bool adv();
bool fals();

char *p,s[1002],f['Z'+5];

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    int n,i; char z;
    gets(s);scanf("%d\n",&n);

    for(i=1;i<=n;i++)
    {
        scanf("%c",&z);
        if(f[z]==false)
            f[z]=true;
        else    f[z]=false;
        p=s;

        if(expresie()==true)
        {
            printf("1");
            continue;
        }
        printf("0");
    }

    return 0;
}

bool expresie()
{
    bool x,y,z;
    x=termen();//++p;
    if(*p=')') return x;
    ++p;
    y=operat();++p;
    z=termen();

    if((y&x&z)||((!y)&&(x||z)))
        return true;
    return false;
}

bool termen()
{
    int semn=1;bool x;
    while(non())
    {
        semn*=-1;
    }
    if(*p=='(')
    {
        ++p;
        if(adv())
            return true;
        if(fals())
            return false;
        x=expresie();
        ++p;
        if((semn==1&&x==true)||(semn==-1&&x==false))
            return true;
        else return false;
    }
    ++p;
    x=f[*(p-1)];
    if((semn==1&&x==true)||(semn==-1&&x==false))
        return true;
    else return false;

}

bool operat()
{
    while(*p>='A'&&*p<='Z')
    {
        ++p;
    }
    if(*(p-1)=='R')
        return false;
    return true;
}

bool adv()
{
    if(*p=='T'&&*(p+1)=='R')
    {
        p+=4;
        return true;
    }
    return false;
}
bool fals()
{
    if(*p=='F'&&*(p+1)=='A')
    {
        p+=5;
        return true;
    }
    return false;
}


bool non()
{
    if(*p=='N'&&*(p+1)=='O')
    {
        p+=4;
        return true;
    }
    return false;
}