Cod sursa(job #535712)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 17 februarie 2011 17:45:09
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<cstdio>
#include<cstring>
const int NMAX=1000;
char S[NMAX];
char s[NMAX];
int f[27];

char *p;
char sep[]={' '};
char c;
int poz;

bool termen();
bool factor();
bool expresie();

void transforma()
{	int  i;
	
	strcpy(S,s);
	int nr=0;
	int nn=strlen(S);
	
	for (i=0;i<nn;++i)
		{
			if (S[i]=='T'&&S[i+1]=='R')
			{
				s[nr++]='1';
				i=i+3;
				continue;
			}
			if (S[i]=='F'&&S[i+1]=='A')
			{
				s[nr++]='0';
				i+=4;
				continue;
			}
			
			if (S[i]==' ')
			{
				continue;
			}
			
			if (S[i]=='N'&&S[i+1]=='O')
			{
				s[nr++]='!';
				i+=2;
				continue;
			}
			if (S[i]=='O'&&S[i+1]=='R')
			{
				s[nr++]='|';
				i+=1;
				continue;
			}
			if (S[i]=='A'&&S[i+1]=='N')
			{
				s[nr++]='&';
				i+=2;
				continue;
			}
			s[nr++]=S[i];
		}			
	s[nr]=0;
	strcpy(S,s);
}

void functie_smechera()
{
	int n,i;
	bool rez;
	
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	
	gets(s);
	transforma();
	
	scanf("%d ",&n);
	
	for (i=1;i<=n;++i)
		{
			scanf("%c",&c);
			f[c-'A']++;
			rez=expresie();
			if (rez==true) 
				printf("1");
			else printf("0");
		}
}

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

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

bool factor()
{
	bool rez3;
		
	if (S[poz]=='!')
	{
		poz++;
		rez3=!factor();
	}
	if (S[poz]=='(')
	{
		poz++;
		rez3=expresie();
		poz++;
		return rez3;
	}
	
	if (S[poz]=='0') 
		return false;
	if (S[poz]=='1') 
		return true;
	if (S[poz]>='A'&&S[poz]<='Z')
		return f[S[poz]-'A']%2;
	
}


int main()
{
	functie_smechera();	
	return 0;
}