Cod sursa(job #884458)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 20 februarie 2013 22:26:28
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;

char buffer[1005];
int len,id,n,i;
char crt;
bool val[30];
stack <bool> values;
stack <char> operators;

bool evariabila(int p) {
    return ('A' <= buffer[p] && buffer[p] <= 'Z' && (buffer[p+1] < 'A' || buffer[p+1] > 'Z'));
}

bool econstanta(int p) {
    bool econst = false;
    if (buffer[p] == 'T' && buffer[p+1] == 'R' && buffer[p+2] == 'U' && buffer[p+3] == 'E') econst = true;
    if (buffer[p] == 'F' && buffer[p+1] == 'A' && buffer[p+2] == 'L' && buffer[p+3] == 'S' && buffer[p+4] == 'E') econst = true;
    return econst;
}

bool eparanteza(int p) {
    return (buffer[p] == '(' || buffer[p] == ')');
}

bool eoperator(int p) {
    bool eop = false;
    if (buffer[p] == 'A' && buffer[p+1] == 'N' && buffer[p+2] == 'D') eop = true;
    if (buffer[p] == 'O' && buffer[p+1] == 'R') eop = true;
	if (buffer[p] == 'N' && buffer[p+1] == 'O' && buffer[p+2] == 'T') eop = true;
    return eop;
}

void domath() {
    bool a,b;
    if (operators.top() == 'A') { /** AND */
		a = values.top(); values.pop();
		b = values.top(); values.pop();
		values.push(a && b); operators.pop();
    } else if (operators.top() == 'O') { /** OR */
		a = values.top(); values.pop();
		b = values.top(); values.pop();
        values.push(a || b); operators.pop();
    } else if (operators.top() == 'N') { /** NOT */
		a = values.top(); values.pop();
		values.push(!a);
	}
}

int main() {
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    fgets(buffer,1004,stdin);
	for (i=0;i<=29;i++) val[i] = true;
    len = strlen(buffer);
    scanf("%d",&n);
    for (int t=1;t<=n;t++) {
        scanf("%c",&crt);
        val[crt-'A'] = !val[crt-'A'];
        for (i=0;i<len-1;i++) {
            crt = buffer[i];
            if (evariabila(i)) {
				if (! operators.empty() && operators.top() == 'N') {
					values.push(!val[crt-'A']);
					operators.pop();
				} else values.push(val[crt-'A']);
            } else if (econstanta(i)) {
                if (crt == 'T') values.push(true);
                else values.push(false);
                while ('A' <= buffer[i+1] && buffer[i+1] <= 'Z') i++;
            } else if (eparanteza(i)) {
                if (crt == '(') operators.push('(');
                else {
					while (operators.top() != '(') domath();
					operators.pop();
				}
            } else if (eoperator(i)) {
                if (crt == 'A') {
                    while (operators.size() > 1 && (operators.top() != '(' || operators.top() == 'N')) domath();
                    operators.push(crt);
                } else if (crt == 'O') {
                    while (operators.size() > 1 && (operators.top() != '(' || operators.top() == 'A' || operators.top() == 'N')) domath();
                    operators.push(crt);
                } else if (crt == 'N') {
					operators.push(crt);
				}
				while ('A' <= buffer[i+1] && buffer[i+1] <= 'Z') i++;
            }
        }
        while (values.size() > 1) domath();
        if (values.top()) printf("1");
        else printf("0");
		values.pop();
    }
    return 0;
}