Cod sursa(job #1901714)

Utilizator felixiPuscasu Felix felixi Data 4 martie 2017 10:42:55
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("bool.in");
ofstream out("bool.out");

const int NMAX = 1000;

string ops;
string mods, line, ans;
int pos;
bool val[30];
int N;

void change() {
    for( int i = 0;  i+1 < (int)line.size();  ++i ) {
        if( line[i] == 'A' && line[i+1] == 'N' ) ops += '&', i += 2;
        else if( line[i] == 'O' && line[i+1] == 'R' ) ops += '|', i += 1;
        else if( line[i] == 'N' && line[i+1] == 'O' ) ops += '!', i += 2;
        else if( line[i] == 'T' && line[i+1] == 'R' ) ops += '1', i += 3;
        else if( line[i] == 'F' && line[i+1] == 'A' ) ops += '0', i += 4;
        else if( std::isalpha(line[i]) || line[i] == '(' || line[i] == ')' ) ops += line[i];
    }
}

bool SAU();

bool NOT() {
    bool ans = 0;
    if( ops[pos] == '(' ) {
        ++pos;
        ans = SAU();
        ++pos;
    }
    else if( ops[pos] == '!' ) {
        ++pos;
        ans = 1 - SAU();
    }
    else if( std::isalpha( ops[pos] ) ) {
        ans = val[ ops[pos] - 'A' ];
        ++pos;
    }
    else ans = ops[pos] - '0';

    return ans;
}

bool SI() {
    bool ans = NOT();
    while( pos < (int)ops.size() && ops[pos] == '&' ) {
        ++pos;
        ans &= NOT();
    }
    return ans;
}

bool SAU() {
    bool ans = SI();
    while( pos < (int)ops.size() && ops[pos] == '|' ) {
        ++pos;
        ans |= SI();
    }
    return ans;
}

int main()
{
    getline( in, line, '\n' );
    line += ' ';
    change();
   /// out << ops << '\n';

    in >> N >> mods;
    for( auto ch : mods ) {
        val[ ch - 'A' ] ^= 1;
        pos = 0;
        ans.push_back( '0' + SAU() );
    }

    out << ans << '\n';

    return 0;
}