Cod sursa(job #1024128)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 8 noiembrie 2013 11:51:21
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <cstring>
using namespace std;
int n, ns, St[1010], vf;
char s[1010], modif[110];
bool val[30];

inline bool Eval()
{
	int i = 0;
	bool var;
	vf = 0;
	while(i < ns)
	{
		if(s[i] == ' ')
		{
			i++;
			continue;
		}
		if(s[i] == '(')
		{
			St[++vf] = -1;
			i++;
			continue;
		}
		if(i + 3 < ns && s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E')
		{
			St[++vf] = 1;
			i += 4;
			continue;
		}
		if(i + 4 < ns && s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E')
		{
			St[++vf] = 0;
			i += 5;
			continue;
		}
		if(i + 2 < ns && s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D')
		{
			St[++vf] = -2;
			i += 3;
			continue;
		}
		if(i + 1 < ns && s[i] == 'O' && s[i + 1] == 'R')
		{
			St[++vf] = -3;
			i += 2;
			continue;
		}
		if(i + 2 < ns && s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T')
		{
			St[++vf] = -4;
			i += 3;
			continue;
		}
		if('A' <= s[i] && s[i] <= 'Z')
		{
			var = val[s[i] - 'A'];
			if(vf && St[vf] == -4)
			{
				var = !var;
				vf--;
			}
			if(vf && St[vf] == -2)
			{
				vf--;
				if(St[vf] == 1)
					var = (var & true);
				else
					var = (var & false);
				vf--;
			}
			St[++vf] = var;
			i++;
			continue;
		}
		if(s[i] == ')')
		{
			if(St[vf] == -1)
				vf--;
			else
			{
				if(St[vf] == 1)
					var = true;
				else
					var = false;
				vf--;
				while(St[vf] != -1)
				{
					if(St[vf] == 1)
						var = (var | true);
					else
						var = (var | false);
					vf--;
				}
				vf--;
			}
			if(vf && St[vf] == -4)
			{
				var = !var;
				vf--;
			}
			if(vf && St[vf] == -2)
			{
				vf--;
				if(St[vf] == 1)
					var = (var & true);
				else
					var = (var & false);
				vf--;
			}
			St[++vf] = var;
			i++;
			continue;
		}
	}
	if(St[vf] == 1)
		var = true;
	else
		var = false;
	vf--;
	while(vf)
	{
		if(St[vf] == 1)
			var = (var | true);
		else
			var = (var | false);
		vf--;
	}
	return var;
}

int main()
{
	int i;
	ifstream fin("bool.in");
	fin.getline(s,1010); ns = strlen(s);
	fin >> n;
	fin >> modif;
	fin.close();
	
	ofstream fout("bool.out");
	for(i = 0; i < n; ++i)
	{
		val[modif[i] - 'A'] = !val[modif[i] - 'A'];
		fout << Eval();
	}
	fout << "\n";
	fout.close();
	return 0;
}