Cod sursa(job #597292)

Utilizator cosmyoPaunel Cosmin cosmyo Data 21 iunie 2011 17:50:20
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>
#include <cstring>
using namespace std;
const int N = 1005;
char s[N], x[N];
int  nr, n, v[N];

int solve(){
    int stack[N], vf = 0, i;
    for(i = 1; i <= nr; ++i)
        if(x[i] <= 'Z' && x[i] >= 'A')
            stack[++vf] = v[x[i] - 'A'];
            else
        if(x[i] == '1' || x[i] =='0')
            stack[++vf] = x[i] - '0';
        else
        if(x[i] == '&'){
            int a = stack[vf], b = stack[--vf];
            stack[vf] = b & a;
        }
        else
        if(x[i] == '|'){
            int a = stack[vf], b = stack[--vf];
            stack[vf] = b | a;
        }
        else
        if(x[i] == '!')
            stack[vf] ^= 1;
    return stack[1];
}

int main() {
    ifstream fin("bool.in");
    ofstream fout("bool.out");

    int i;
    fin.get(s, 1000, '\n');
    int r = strlen(s);
    char stack[N];
    int vf = 0;
    i = 0;

    while(i < r) {
        if(s[i] == ' ')
            ;
            else
        if(s[i] == '(')
            stack[++vf] = '(';
            else
        if(s[i] == ')'){
            while(vf && stack[vf] != '('){
                  x[++nr] = stack[vf];
                  --vf;
            }
            --vf;
        }
        else
        if(s[i] == 'T') {
            if(strncmp(&s[i], "TRUE", 4) == 0){
                x[++nr] = '1';
                i += 3;
            }
            else
            x[++nr] = s[i];
        }
        else
        if(s[i] == 'F') {
            if(strncmp(&s[i], "FALSE", 5) == 0){
                x[++nr] = '0';
                i += 4;
            }
            else
            x[++nr] = s[i];
        }
        else
        if(s[i] == 'O'){
            if(strncmp(&s[i], "OR", 2) == 0){
                while(vf && stack[vf] == '!'){
                    x[++nr]=stack[vf];
                    --vf;
                }
                stack[++vf] = '|', ++i;
            }
            else
            x[++nr] = s[i];
        }
        else
        if(s[i] == 'A'){
            if(strncmp(&s[i], "AND", 3) == 0){
                while(vf && stack[vf] == '!'){
                    x[++nr] = stack[vf];
                    --vf;
                }
                stack[++vf] = '&', i += 2;
            }
            else
            x[++nr] = s[i];
        }
        else
        if(s[i] == 'N'){
            if(strncmp(&s[i], "NOT", 3) == 0){
                i += 2;
                stack[++vf] = '!';
            }
            else
            x[++nr] = s[i];
        }
        else
        x[++nr] = s[i];
        ++i;
    }


    while(vf ){
        x[++nr] = stack[vf];
        --vf;
    }

    fin>>n;
    char c;
    for(i = 1; i <= n;++i){
        fin >> c;
        v[c - 'A'] ^= 1;
        fout<<solve();
    }

    fout<<'\n';
    fin.close();
    fout.close();
    return 0;
}