Cod sursa(job #94738)

Utilizator piroslPiros Lucian pirosl Data 25 octombrie 2007 02:51:55
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.55 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
using namespace std;

bool chars[30];
stack<string> operatori;
string poloneza[2001];
int pozitie;

void transform(string expresie)
{
	while(expresie.length() > 0)
	{
		if(expresie.at(0) == ' ')
			expresie.erase(0,1);
		
		if(expresie.at(0) == '(')
		{
			operatori.push("(");
			expresie.erase(0,1);
			continue;
		}
		if(expresie.at(0) == ')')
		{
			while(!operatori.empty())
			{
				string o = operatori.top();
				operatori.pop();
				if(o.compare("(") == 0)
					break;
				poloneza[pozitie++].assign(o);
			}
			expresie.erase(0,1);
			continue;
		}

		int poz1 = expresie.find_first_of(" ");
		int poz2 = expresie.find_first_of(")");
		string s1;
		if(poz1 > 0 && poz2 > 0)
		{
			int min = poz1;
			if(poz2<poz1)
				min = poz2;
			s1 = expresie.substr(0, min);
			expresie = expresie.substr(min);
		}
		else
		{
			if(poz1 > 0)
			{
				s1 = expresie.substr(0, poz1);
				expresie = expresie.substr(poz1);
			}
			else
			{
				if(poz2 > 0)
				{
					s1 = expresie.substr(0, poz2);
					expresie = expresie.substr(poz2);
				}
				else
				{
					s1 = expresie;
					expresie = "";
				}
			}
		}
		if(s1.length() == 1)
		{
			poloneza[pozitie] = "";
			poloneza[pozitie++].append(s1);
		}
		if(s1.compare("TRUE") == 0)
		{
			poloneza[pozitie] = "";
			poloneza[pozitie++].append("TRUE");
		}
		if(s1.compare("FALSE") == 0)
		{
			poloneza[pozitie] = "";
			poloneza[pozitie++].append("FALSE");
		}
		if(s1.compare("NOT") == 0)
		{
			operatori.push("NOT");
		}
		if(s1.compare("AND") == 0)
		{
			while(!operatori.empty())
			{
				string o = operatori.top();
				if(o.compare("NOT") == 0 ) 
				{
					operatori.pop();
					poloneza[pozitie] = "";
					poloneza[pozitie++].append(o);
					continue;
				}
				break;
			}
			operatori.push("AND");
		}
		if(s1.compare("OR") == 0)
		{
			while(!operatori.empty())
			{
				string o = operatori.top();
				if(o.compare("OR") == 0 || o.compare("(") == 0) 
				{
					break;
				}
				operatori.pop();
				poloneza[pozitie] = "";
				poloneza[pozitie++].append(o);
				break;
			}
			operatori.push("OR");
		}		
	}
	while(!operatori.empty())
	{
		poloneza[pozitie++].assign(operatori.top());
		operatori.pop();
	}
}


int main(void)
{
	ifstream in;
	ofstream out;
	in.open("bool.in");
	out.open("bool.out");
	string expresie;
	
	char read[1001];
	in.getline(read, 1001);
	expresie.assign(read);

	transform(expresie);

	for(int i=0;i<30;++i)
		chars[i] = false;
	
	int n;
	in >> n;
	for(int i=0;i<n;++i) 
	{
		char ch;
		in >> ch;
		stack<bool> value;
		chars[ch-'A'] = !chars[ch-'A'];
		for(int k=0;k<pozitie;++k)
		{
			if(poloneza[k].length() == 1)
				value.push(chars[poloneza[k].at(0) - 'A']);
			if(poloneza[k].compare("TRUE") == 0)
				value.push(true);
			if(poloneza[k].compare("FALSE") == 0)
				value.push(false);
			if(poloneza[k].compare("NOT") == 0)
			{
				bool b = value.top();
				value.pop();
				value.push(!b);
			}
			if(poloneza[k].compare("AND") == 0)
			{
				bool b = value.top();
				value.pop();
				bool a = value.top();
				value.pop();
				value.push(a && b);
			}
			if(poloneza[k].compare("OR") == 0)
			{
				bool b = value.top();
				value.pop();
				bool a = value.top();
				value.pop();
				value.push(a || b);
			}
		}
		bool r = value.top();
		value.pop();
		if(r)
			out << "1";
		else
			out << "0";
	}

	out << "\n";
	in.close();
	out.close();
	return 0;
}