Cod sursa(job #1742079)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 15 august 2016 19:33:45
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 110
#define MAXLEN 1050

using namespace std;

char s[MAXLEN], changes[MAXN];
int n, val[30];

void citire()
{
    gets(s);
    scanf("%d\n", &n);
    gets(changes);
}
int check(int st, int dr, char v[])
{
	int par = 0;
	int rez = 0;
	for (int i = dr; i >= st; i--) {
        if (s[i] == ')') par++;
        else if (s[i] == '(') par--;
        else if (par == 0) {
			int ok = 1;
			for (int ind = strlen(v)-1; ok && ind >= 0; ind--)
				if (s[i] != v[ind])
					ok = 0;
				else
					i--;
			if (ok)
				return i+1;
        }
    }
    return -1;
}
int eval(int st, int dr)
{
    if (st > dr)return 1;
    int x;
    if ((x = check(st, dr, "OR")) != -1)
        return eval(st, x-2) | eval(x+3, dr);
    else if ((x = check(st, dr, "AND")) != -1)
		return eval(st, x-2) & eval(x+4, dr);
    else if ((x = check(st, dr, "NOT")) != -1)
		return !eval(x+4, dr);
	else if (s[st] == '(' && s[dr] == ')')
		return eval(st+1, dr-1);
    else if ((x = check(st, dr, "TRUE")) != -1)
        return 1;
	else if ((x = check(st, dr, "FALSE")) != -1)
		return 0;
	else if (st == dr)
		return val[s[st]-'A'];
	else {
		cerr << "ERROR";
	}
}

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);

    citire();
	for (int i = 0; i < n; i++)
	{
        val[changes[i]-'A'] = !val[changes[i]-'A'];
        printf("%d", eval(0, strlen(s)-1));
	}

    return 0;
}