Cod sursa(job #1969076)

Utilizator mirunazMiruna Zavelca mirunaz Data 18 aprilie 2017 11:24:13
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <cstdio>
#include <cstring>
using namespace std;

int n, c[27], val, p, m;
char s1[1001], s[1001], x;

bool rewrite ()
{
    int j = 0;
    m = strlen (s1);
    for (int i=0; i<m; i++){
        if (s1[i] == ')' || s1[i] == '('){
            s[j] = s1[i];
            i ++;

            if (s[j] == ')' && s[j-2] == '('){
                s[j-2] = s[j-1];
                j -= 2;
            }
        }
        else if (s1[i] >= 'A' && s1[i] <= 'Z' && (s1[i+1] <= 'A' || s1[i+1] >= 'Z')){
            s[j] = s1[i];
            i ++;
        }
        else if (s1[i] == 'T'){
            s[j] = '1';
            i += 4;
        }
        else if (s1[i] == 'F'){
            s[j] = '0';
            i += 5;
        }
        else if (s1[i] == 'N'){
            s[j] = '~';
            i += 3;
        }
        else if (s1[i] == 'A'){
            s[j] = '&';
            i += 3;
        }
        else if (s1[i] == 'O'){
            s[j] = '|';
            i += 2;
        }
        else {
            j --;
            i ++;
        }

        j ++;
        i --;
    }

    s[j] = NULL;
    m = j;
}

int factor ();

int expresie ()
{
    p ++;
    int ans = factor ();
    p ++;

    return ans;
}

int element ()
{
    int ans;

    if (s[p] == '('){
        ans = expresie ();
    }

    else if (s[p] == '0' || s[p] == '1'){
        ans = s[p];
        p ++;
    }

    else{
        ans = c[s[p] - 64];
        p ++;
    }

    return ans;
}

int termen ()
{
    int ans ;

    if (s[p] == '('){
        ans = expresie ();
    }

    else if (s[p] == '~'){
        p ++;
        ans = element ();
        ans = (ans + 1) %2;
    }

    else{
        ans = element ();
    }

    return ans;
}

int factor ()
{
    int ans = termen (), ans2;

    while (s[p] == '&' || s[p] == '|'){
        if (s[p] == '&'){
            p ++;
            ans2 = termen ();
            ans &= ans2;
        }

        else if (s[p] == '|'){
            p ++;
            ans2 = termen ();
            ans |= ans2;
        }
    }

    return ans;
}

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

    gets (s1);

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

    for (int i=1; i<=n; i++){
        scanf ("%c", &x);
        c[x - 64] = (c[x - 64] + 1) % 2;
        p = 0;
        printf ("%d", factor ());
    }

    return 0;
}