Cod sursa(job #941717)

Utilizator andreiagAndrei Galusca andreiag Data 19 aprilie 2013 15:41:59
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.44 kb
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <set>
#include <stack>
#include <string>
#include <cctype>

using namespace std;

stack<char> operations;
stack<bool> factors;
map<char, bool> dict;
// NOT > AND > OR;

int order(char c)
{
    int ret = 0;
    switch (c) {
        case '!': ret = 3; break;
        case '&': ret = 2; break;
        case '|': ret = 1; break;
    }
    return ret;
}

bool high_prec(char a, char b)
{
    int x = order(a), y = order(b);
    return (x > y);
}

string process_line(string &line)
{
    string ret;
    operations.push('#');
    int s = line.size();
    int  i = 0;
    while (i < s) {
        char c = line[i];
        if (c == ' ') i++;
        else if (c == '(') {operations.push(c); i++;} //open parentheses
        else if (c == ')') {char d = operations.top();
                            while(d != '('){ret += d; operations.pop(); d = operations.top();}
                            operations.pop(); i++;} //close parentheses
        else if (i == s - 1 || !isalpha(line[i+1])) {ret += c; i++;} //single letter, so symbol
        else if (c == 'T') {ret += '1'; i += 4;}
        else if (c == 'F') {ret += '0'; i += 5;}
        else {int k = 1; switch (c) {
                        case 'A' : {c = '&'; k = 3;} break;
                        case 'O' : {c = '|'; k = 2;} break;
                        case 'N' : {c = '!'; k = 3;} break;}
              if (operations.top() == '#') {operations.push(c); i += k;}
              else {char d = operations.top();
                    while (d != '(' && d != '#'  && !high_prec(c,d)) {
                           ret += d; operations.pop(); d = operations.top();}
                    operations.push(c); i += k;
            }
        }
    }
    char d = operations.top();
    while(d != '#') {
        ret += d;
        operations.pop();
        d = operations.top();
    }
    return ret;
}

bool eval_str(string &RPN)
{
    bool tmp1, tmp2;
    int i = 0;
    int s = RPN.size();
    while(i < s) {
        char c = RPN[i];
        if(isalnum(c)) factors.push(dict[c]);
        else switch (c) {
                case '!':   tmp1 = factors.top(); factors.pop();
                            factors.push(!tmp1); break;
                case '&':   tmp1 = factors.top(); factors.pop();
                            tmp2 = factors.top(); factors.pop();
                            factors.push(tmp1 && tmp2); break;
                case '|':   tmp1 = factors.top(); factors.pop();
                            tmp2 = factors.top(); factors.pop();
                            factors.push(tmp1 || tmp2); break;
            }
        i++;
    }

    return factors.top();
}



int main()
{

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

    string line, change;
    int N;
    getline(fin, line);
    fin >> N;
    getline(fin, change);
    getline(fin, change);

    dict['0'] = 0;
    dict['1'] = 1;

    for(int i = 0; i < 26; i++)
        dict[i+65] = false;
/*
    for(map<char, bool>::iterator it = dict.begin(); it != dict.end(); it++)
        cout << it->first << ":" << it->second << " ";
*/
    string RPN = process_line(line);
    //cout << RPN << endl;

    for(int i = 0; i < N; i++) {
        char c = change[i];
        dict[c] = !dict[c];
        bool tmp = eval_str(RPN);
        fout << tmp;
    }
    fout << endl;

    return 0;
}