Cod sursa(job #626793)

Utilizator voicuraduVoicu Radu voicuradu Data 28 octombrie 2011 12:08:54
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<cstdio>
int n,p,i,u=-1,q,val;
char ex[1010],s[1010],sc[110],cs[1100];
bool v[100];
using namespace std;
bool expresie();
bool orr();
bool andd ();
void read()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    gets(ex);
    scanf("%d\n",&n);
    gets(sc);
}

bool expresie()
{
    bool vl;
    bool semn=1;
    while(cs[p]=='!')
        {
            p++;
            semn=!semn;
        }
    if(cs[p]=='(')
    {
        p++;
        vl=andd();
        p++;
        if(semn)
            return vl;
        else
            return !vl;
    }
    if(cs[p]=='0')
        vl=0;
    else
        vl=1;
    p++;
    if(semn)
        return vl;
    else
        return !vl;
}

bool orr()
{
    bool rez=expresie();
    while(cs[p]=='&')
        {
            p++;
            rez=rez && expresie();
        }
    return rez;
}


bool andd()
{
    bool rez=orr();
    while(cs[p]=='|')
    {
        p++;
        rez=rez || orr();
    }
    return rez;
}

int litera(char c)
{
    if(c>='A' && c<='Z')
        return 1;
    return 0;
}

void parsare()
{
    for(i=0;ex[i]!='\0';i++)
    {
        if((i!=0 && litera(ex[i]) && !litera(ex[i-1]) && !litera(ex[i+1])) || i==0)
            s[++u]=ex[i];
        if(!litera(ex[i]) && ex[i]!=' ')
            s[++u]=ex[i];
        if(ex[i]=='N' && ex[i+1]=='O')
        {
            s[++u]='!';
            i+=2;
        }
        if(ex[i]=='A' && ex[i+1]=='N')
        {
            s[++u]='&';
            i+=2;
        }
        if(ex[i]=='O' && ex[i+1]=='R')
        {
            s[++u]='|';
            i++;
        }
        if(ex[i]=='T' && ex[i+1]=='R')
        {
            s[++u]='1';
            i+=3;
        }
        if(ex[i]=='F' && ex[i+1]=='A')
        {
            s[++u]='0';
            i+=3;
        }
    }
}

void rez()
{
    p=0;
    parsare();

    for(q=0;q<n;q++)
    {
        val=sc[q]-'A';
        if(v[val]==1)
            v[val]=0;
        else
            v[val]=1;
        for(i=0;i<=u;i++)
            if(litera(s[i]))
            {
                val=s[i]-'A';
                if(v[val]==1)
                    cs[i]='1';
                else
                    cs[i]='0';
            }
            else
            cs[i]=s[i];
    p=0;
    val=expresie();
    printf("%d",val);
    }
    printf("\n");
}

int main()
{
    read();
    rez();
    return 0;
}