Cod sursa(job #598111)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 24 iunie 2011 16:21:56
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
# include <fstream>
using namespace std;

ifstream f ("bool.in");
ofstream g ("bool.out");

char s[1200], s2[1200], c;
int n, i, in, val[200];

int si ();
int sau ();
int nt ();
int termen ();

int si ()
{
	int val = nt ();
	while (s[in] == '&')
	{
		if (s[in] == '&')
		{
			++in;
			val = val and nt ();
		}
	}
	return val;
}

int sau ()
{
	int val = si ();
	while (s[in] == '|')
	{
		if (s[in] == '|')
		{
			++in;
			val = val or si ();
		}
	}
	return val;
}

int nt ()
{
	int vl = 0;
	if (s[in] == '!')
	{
		++in;
		vl = not vl;
	}
	if (s[in] == '(')
	{
		++in;
		vl = vl xor sau ();
		++in;
	}
	else
	{
		vl = vl xor val[s[in] - 0];
		++in;
	}
	return vl;
}

int l;
int main ()
{
	f.get (s, 1100);
	int ls = strlen (s);
	val['1' - 0] = 1; val['0' - 0] = 0;
	for (i = 0; i < ls; )
	{
		if (s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E')
			s2[l++] = '1', i += 4;
		else
		if (s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E')
			s2[l++] = '0', i += 5;
		else
		if (s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D')
			s2[l++] = '&', i += 3;
		else
		if (s[i] == 'O' && s[i + 1] == 'R')
			s2[l++] = '|', i += 2;
		else
		if (s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T')
			s2[l++] = '!', i += 3;
		else
		if (s[i] >= 'A' && s[i] <= 'Z')
			s2[l++] = s[i], ++i;
		else
		if (s[i] == '(' || s[i] == ')')
			s2[l++] = s[i], ++i;
		else ++i;
	}
	
	memcpy (s, s2, sizeof (s2));
	f >> n;
	for (i = 1; i <= n; ++i)
	{
		f >> c;
		in = 0;
		val[c - 0] = not val[c - 0];
		g << sau ();
	}
	g.close ();
	return 0;
}