Cod sursa(job #1835255)

Utilizator Joystick6208Catalin Topala Joystick6208 Data 26 decembrie 2016 16:50:51
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;

string s;
int n, it;
bool v[26];
char c;

string transf(string s)
{
	string rez = "";
	int i = 0;

	int len = s.size();
	while(i < len)
		if(s[i] == ' ')
			++i;
		else if(i+1 < len && s[i] == 'N' && s[i+1] == 'O')
			rez += '!', i += 3;
		else if(i+1 < len && s[i] == 'A' && s[i+1] == 'N')
			rez += '&', i += 3;
		else if(i+1 < len && s[i] == 'O' && s[i+1] == 'R')
			rez += '|', i += 2;
		else if(i+1 < len && s[i] == 'T' && s[i+1] == 'R')
			rez += '1', i += 4;
		else if(i+1 < len && s[i] == 'F' && s[i+1] == 'A')
			rez += '0', i += 5;
		else
			rez += s[i], ++i;

	return rez;
}

bool term();
bool fact();

bool expr()
{
	bool val = term();

	while(s[it] == '|')
		++it, val |= term();
	
	return val;
}

bool term()
{
	bool val = fact();

	while(s[it] == '&')
		++it, val &= fact();
	
	return val;
}

bool fact()
{
	if(s[it] == '!')
	{
		++it;
		return !fact();
	}
	else if(s[it] == '(')
	{
		++it;
		bool val = expr();
		++it;

		return val;
	}
	else if(s[it] == '1')
	{
		++it;
		return 1;
	}
	else if(s[it] == '0')
	{
		++it;
		return 0;
	}
	
	++it;
	return v[s[it-1] - 65];
}

int main()
{
	ios_base::sync_with_stdio(false);

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

	getline(cin, s);
	s = transf(s);

	cin >> n;

	while(n--)
	{
		cin >> c;
		v[c-65] ^= 1;

		it = 0;
		cout << expr();
	}

	return 0;
}