Cod sursa(job #1821317)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 2 decembrie 2016 21:43:06
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <cstdio>
#include <cstring>
using namespace std;
FILE *fin = fopen("bool.in", "r");
FILE *fout = fopen("bool.out", "w");
char v[10000];
int a[10000];
int dimensiune, p , n;
bool termen();
bool valoare();
bool expresie();
bool expresie()
{
    while (v[p] == ' ' && p <= dimensiune) p++;
    bool sol = termen();
    while (v[p] == ' ' && p <= dimensiune) p++;
    if(p+1<=dimensiune && v[p]=='O' && v[p+1]=='R')
    {
        p+=2;
        sol = sol | termen();
    }
    while (v[p] == ' ' && p <= dimensiune) p++;
    return sol;
}
bool termen()
{
    while (v[p] == ' ' && p <= dimensiune) p++;
    bool sol = valoare();
    while (v[p] == ' ' && p <= dimensiune) p++;
    if(p+2<=dimensiune && v[p]=='A' && v[p+1]=='N' && v[p+2]=='D')
    {
        p+=3;
        sol = (sol & valoare());
    }
    while (v[p] == ' ' && p <= dimensiune) p++;
    return sol;
}
bool valoare()
{
    while (v[p] == ' ' && p <= dimensiune) p++;
    bool x;
    if(v[p]=='(')
    {
        p++;
        x = expresie();
        p++;
    }
    else
    {
        if(p+2<=dimensiune && v[p]=='N' && v[p+1]=='O' && v[p+2]=='T')
        {
            p+=3;
            x = 1 - valoare();
        }
        else
        {
            if(p+3<=dimensiune && v[p]=='T' && v[p+1]=='R' && v[p+2]=='U' && v[p+3]=='E')
            {
                p+=4;
                x = 1;
            }
            else
            {
                if(p+4<=dimensiune && v[p]=='F' && v[p+1]=='A' && v[p+2]=='L' && v[p+3]=='S' && v[p+4]=='E')
                {
                    p+=5;
                    x = 0;
                }
                else
                {
                        x = a[v[p]-'A'];
                        p++;
                }
            }
        }
    }
    while (v[p] == ' ' && p <= dimensiune) p++;
    return x;
}
char c;
int main()
{
    fscanf(fin, "%c", &c);
    int ramas = 1;
    while(c!='\n')
    {
        v[ramas] = c;
        ramas++;
        fscanf(fin, "%c", &c);
    }
    ramas--;
    dimensiune = ramas;
    fscanf(fin, "%d", &n);
    fscanf(fin, "%c", &c);
    for(int i = 1; i<=n;i++)
    {
        fscanf(fin, "%c", &c);
        a[c-'A'] = 1-a[c-'A'];
        p=1;
        int solutie = expresie();
        if(solutie == 1) fprintf(fout,"1");
        else fprintf(fout,"0");
    }
    return 0;
}