Cod sursa(job #577817)

Utilizator mihai995mihai995 mihai995 Data 10 aprilie 2011 17:22:29
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
using namespace std;

const int N=1023;
int poz,n;
bool v[200];
char s[N],r[N];
bool expresie(),termen(),factor();

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

inline bool litera(char c)
{
	return c=='a' || c=='f' || c>='A' && c<='Z';
}

inline char next(int &x)
{
	while (r[x]==' ')
		x++;
	if (litera(r[x]) && !litera(r[x+1]) || r[x]=='(' || r[x]==')')
		return r[x++];
	if (r[x]=='N')
	{
		x+=3;
		return '!';
	}
	if (r[x]=='A')
	{
		x+=3;
		return '&';
	}
	if (r[x]=='O')
	{
		x+=2;
		return '|';
	}
	if (r[x]=='T')
	{
		x+=4;
		return 'a';
	}
	x+=5;
	return 'f';
}

bool expresie()
{
	bool val=termen();
	while (s[poz]=='|')
	{
		poz++;
		val|=termen();
	}
	return val;
}

bool termen()
{
	bool val=factor();
	while (s[poz]=='&')
	{
		poz++;
		val&=factor();
	}
	return val;
}

bool factor()
{
	bool sgn=false;
	while(s[poz]=='!')
	{
		poz++;
		sgn=!sgn;
	}
	if (s[poz]=='(')
	{
		++poz;
		sgn^=expresie();
		++poz;
		return sgn;
	}
	return v[s[poz++]-'A']^sgn;
}

int main()
{
	int x,i;
	in.getline(r,N);
	for (i=0;r[i];)
		s[++n]=next(i);
	in>>x;
	in>>r+1;v['a'-'A']=true;
	for (i=1;i<=x;i++)
	{
		v[r[i]-'A']=!v[r[i]-'A'];
		poz=1;
		out<<expresie();
	}
	out<<"\n";
	return 0;
}