Cod sursa(job #2083735)

Utilizator anamaria41Raicu Ana anamaria41 Data 8 decembrie 2017 01:54:55
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

int x,i,n,k;
char c, s[1010], *p;
bool a[105];

bool exand();
bool exor();
bool eval();


int main()
{

    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);

    scanf("%c", &c);

    while (c!='\n')
    {
        s[k++]=c;
        scanf("%c", &c);
    }

    scanf ("%d", &n);
    scanf("%c", &c);

    for(i=1; i<=n; i++)
        a[i]=false;

    for(i=1; i<=n; i++)
    {
        scanf ("%c", &c);
        p=s; x=c-'A';
        a[x]=!a[x];
        if (exor()==true) printf ("1");
        else printf ("0");
    }
    printf ("\n");

    return 0;
}

///////////////////////////////////////////////////

bool exor()
{
    bool r;
    r=exand();
    if ( *p=='O' && *(p+1)=='R')
    {   p+=3;   r=r|exand();    }
    return r;
}

bool exand ()
{
    bool r;
    r=eval();
    if ( *p=='A' && *(p+1)=='N' )
    {   p+=4;   r=r&eval(); }
    return r;
}

bool eval()
{
    bool r=false;

    if ( *p=='(')
    {
        p++;
        r=exor();
        p++;
    }
    else if ( *p=='N' && *(p+1)=='O' )
    {
        p+=4;
        r=!eval();
    }
    else if (*p=='F' && *(p+1)=='A')
    {
        r=false;
        p+=6;
    }
    else if ( *p=='T' && *(p+1) =='R' )
    {
        r=true;
        p+=5;
    }
    else
    {
        if (a[*p-'A']==false) r=false;
        else r=true;
        p+=2;
    }
    return r;

}