Cod sursa(job #2533603)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 29 ianuarie 2020 14:09:20
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char s[1010], c, v[1010];
int fr[1010], lit, k, i;
int Or(), And(), Xor(), Factor();

int Or() {
    int r = And();
    while ( v[i] == '|' ){
        i++;
        r |= And();
    }
    return r;
}

int And() {
    int r = Xor();
    while ( v[i] == '&' ){
        i++;
        r &= Xor();
    }
    return r;
}

int Xor() {
    int r = Factor();
    while ( v[i] == '^' ){
        i++;
        r ^= Factor();
    }
    return r;
}

int Factor() {
    int r;
    if ( v[i] == '(' ){
        i++;
        r = Or();
        i++;
    } else {
        if ( v[i] == '1' ){
            i++;
            return 1;
        }
        if ( v[i] == '0' ){
            i++;
            return 0;
        }
        return fr[v[i++]];
    }
    return r;
}

///A&((B|1^C)|((1)))

int main()
{
    f.getline(s, 1002);
    for ( i=0; s[i]; i++ ){
        if ( s[i] == ' ' )
            continue;
        if ( s[i] == '(' || s[i] == ')' ){
            v[k++] = s[i];
            continue;
        }
        if ( s[i] == 'T' && s[i+1] == 'R' ){
            v[k++] = '1';
            i += 3;
            continue;
        }
        if ( s[i] == 'F' && s[i+1] == 'A' ){
            v[k++] = '0';
            i += 4;
            continue;
        }
        if ( s[i] == 'O' && s[i+1] == 'R' ){
            v[k++] = '|';
            i++;
            continue;
        }
        if ( s[i] == 'A' && s[i+1] == 'N' ){
            v[k++] = '&';
            i += 2;
            continue;
        }
        if ( s[i] == 'N' && s[i+1] == 'O' ){
            v[k++] = '1';
            v[k++] = '^';
            i += 2;
            continue;
        }
        v[k++] = s[i];
    }

    for ( f>>lit; lit--; ){
        f>>c;
        fr[c] = 1-fr[c];
        i = 0;
        g<<Or();
    }
    return 0;
}