Cod sursa(job #2165953)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 13 martie 2018 14:38:00
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;

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


bool values[256];

string str, fliper;
int ptr, n;


static bool expression();
static bool priority_1();
static bool num();

static void advance() {
	while (str[ptr] == ' ')
		ptr+= 1; }

static bool _true(const int &ptr) {
	return str[ptr] == 'T' && str[ptr + 1] == 'R'; }

static bool _false(const int &ptr) {
	return str[ptr] == 'F' && str[ptr + 1] == 'A';}

static bool _and(const int &ptr) {
	return str[ptr] == 'A' && str[ptr + 1] == 'N'; }

static bool _or(const int &ptr) {
	return str[ptr] == 'O' && str[ptr + 1] == 'R'; }

static bool _not(const int &ptr) {
	return str[ptr] == 'N' && str[ptr + 1] == 'O'; }

static bool expression() {
	bool ant = priority_1();

	advance();
	while (_or(ptr)) {
		ptr+= 2; 
		ant|= priority_1();
		advance(); }
	ptr+= 1;

	return ant; }

static bool priority_1() {
	bool ant = num();

	advance();
	while (_and(ptr)) {
		ptr+= 3;
		ant&= num();
		advance(); }

	return ant; }

static bool num() {
	bool ant, flip = false;

	advance();
	while (_not(ptr)) {
		flip^= 1;
		ptr+= 3;
		advance(); }
	advance();
	if (str[ptr] == '(') {
		ptr+= 1;
		return expression() ^ flip; }

	if (_false(ptr)) {
		ptr+= 5;
		advance();
		return false ^ flip; }
	if (_true(ptr)) {
		ptr+= 4;
		advance();
		return true ^ flip; }

	ant = values[str[ptr++]] ^ flip;
	advance();
	return ant; }

int main() {
	getline(fi, str);
	fi >> n >> fliper;

	for (auto ch: fliper) {
		values[ch]^= 1;
		ptr = 0;
		fo << int(expression()); }
	fo << endl;

	return 0; }