Cod sursa(job #377501)

Utilizator SheepBOYFelix Liviu SheepBOY Data 24 decembrie 2009 22:20:17
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
char s[1001],chng[1001];
int i;
bool flg[1001];

bool RSolve(int pos,int sw)
{
	bool swch=(sw&1);
	bool rez=0;
	short crnt_op=0;
	for(i=pos;s[i];++i)
	{
		if(s[i]=='(')
		{
			switch(crnt_op)
			{
				case 0:rez=RSolve(i+1,sw);break;
				case 1:rez&=RSolve(i+1,sw);break;
				case 2:rez|=RSolve(i+1,sw);break; 
			}
		}
		if(s[i]==')')
		{
			++i;
			return rez;
		}
		if(s[i]>='A'&&s[i]<='Z')
		{ 
			if(s[i]==chng[sw])
				flg[i]=!flg[i];
			
			if(s[i+1]&&s[i+1]>='A'&&s[i+1]<='Z')
			{
				if(s[i]=='N')
				{
					i+=2;
					flg[i+2]=!flg[i+2];
				}
				if(s[i]=='A')
				{
					i+=2;
					crnt_op=1;
				}
				if(s[i]=='O')
				{
					++i;
					crnt_op=2;
				}
				if(s[i]=='T')
				{
					i+=3;
					switch(crnt_op)
					{
						case 0:rez=(1>swch)?1:0;break;
						case 1:rez&=(1>swch)?1:0;break;
						case 2:rez|=(1>swch)?1:0;break;
					}
				}
				if(s[i]=='F')
				{
					i+=3;
					switch(crnt_op)
					{
						case 0:rez=(0<swch)?1:0;break;
						case 1:rez&=(0<swch)?1:0;break;
						case 2:rez|=(0<swch)?1:0;break;
					}
				}
			}
			else
			{
				switch(crnt_op)
				{
					case 0:rez=(1&flg[i]);break;
					case 1:rez&=(1&flg[i]);break;
					case 2:rez|=(1&flg[i]);break;
				}
			}
		}
	}
return rez;
}
int main()
{
	int nch=0;
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	gets(s);
	scanf("%d\n",&nch);
	gets(chng);
	for(int j=0;j<nch;++j)
		printf("%d",RSolve(0,j));
}