Cod sursa(job #2083734)

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

using namespace std;

int poz,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;
        poz=c-'A';
            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[poz]==false)
            a[poz]=r=true;
        else
            a[poz]=r=false;
        p+=2;
    }
    return r;

}