Cod sursa(job #1452683)

Utilizator mariakKapros Maria mariak Data 21 iunie 2015 17:09:34
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.3 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Dim 1005

using namespace std;
int n,i,p,m,nr;
char s[Dim],t[Dim],ch,var[105];
int val[27];

int expresie();
int termen();
int factor ();

int expresie()
{
    int sau = termen();
    while(s[p] == '|')
    {
        p ++;
        sau = sau | termen();
    }

    return sau;
}

int termen()
{
    int si = factor();
    while(s[p] == '&')
    {
        p ++;
        si = si & factor();
    }
    return si;
}

int factor()
{
    int Val = 0, semn = 1;
    while(s[p] == '~')
    {
        if(semn) semn = 0;
        else semn = 1;
        p ++;
    }
    if(s[p] == '(')
    {
        p ++;
        Val = expresie();
        p++;
        return semn * Val;
    }
    if(s[p] >= 'A' && s[p] <= 'Z')
    {
        if(val[s[p] - 'A'] == -1) Val = 0;
        else Val = 1;
    }
    return semn * Val;
}
int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    gets(s);
    /// standardizez sirul
    while(i < strlen(s))
    {
        if(s[i] == 'O' && s[i + 1] == 'R')
        {
            memset(t, 0, sizeof(t));
            strncpy(t, s, i);
            m = strlen(t);
            t[m] = '|';
            m ++;
            strcat(t, s + i + 2);
            memset(s, 0, sizeof(s));
            strcpy(s, t);
            i += 2;
        }

        else if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T')
        {
            memset(t, 0, sizeof(t));
            strncpy(t, s, i);
            m = strlen(t);
            t[m] = '~';
            m ++;
            strcat(t, s + i + 3);
            memset(s, 0, sizeof(s));
            strcpy(s, t);
            i += 2;
        }

        else if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D')
        {
            memset(t, 0, sizeof(t));
            strncpy(t, s, i);
            m = strlen(t);
            t[m] = '&';
            m ++;
            strcat(t, s + i + 3);
            memset(s, 0, sizeof(s));
            strcpy(s, t);
            i += 2;
        }
        else if(s[i] == 'T' && s[i + 1] == 'R' &&
                s[i + 2] == 'U' && s[i + 3] == 'E')
        {
            memset(t, 0, sizeof(t));
            strncpy(t, s, i);
            m = strlen(t);
            t[m] = '1';
            m ++;
            strcat(t, s + i + 4);
            memset(s, 0, sizeof(s));
            strcpy(s, t);
            i += 2;
        }

        else if(s[i] == 'F' && s[i + 1] == 'A' &&
                s[i + 2] == 'L' && s[i + 3] == 'S'
                && s[i + 4] == 'E')
        {
            memset(t, 0, sizeof(t));
            strncpy(t, s, i);
            m = strlen(t);
            t[m] = '0';
            m ++;
            strcat(t, s + i + 5);
            memset(s, 0, sizeof(s));
            strcpy(s, t);
            i += 2;
        }
        else
        {
            if (s[i] >= 'A' && s[i] <= 'Z')
                val[s[i] - 'A'] = -1;
            i ++;
        }

    }

    scanf("\n");
    scanf("%d\n", &n);
    gets(var);
    for(i = 0; i < n; ++ i)
    {

        if(val[var[i] - 'A'] == -1)
            val[var[i] - 'A'] = 1;
        else
            val[var[i] - 'A'] = -1;

        printf("%d",expresie());
    }

    return 0;
}