Cod sursa(job #536288)

Utilizator Teodor94Teodor Plop Teodor94 Data 18 februarie 2011 15:18:49
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<cstdio>
#include<string>

const int N=5000;
const int M=100;

char s[N],s1[N],ss[M],sep[]={' '},*p;
bool valoare[M];
int m,poz,n;

bool expresie();
bool termen();

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

void citire()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	gets(s);
	scanf("%d\n",&m);
	gets(ss);
	init();
}

bool factor()
{
	bool semn=true,rez;
	while (s1[poz]=='!')
		++poz,semn=!semn;
	if (s1[poz]=='(')
	{
		poz++;
		rez=expresie();
		poz++;
		if (semn)
			return rez;
		return !rez;
	}
	rez=valoare[s1[poz]-'A'];
	poz++;
	if (semn)
		return rez;
	return !rez;
}

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

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

void afis()
{
	poz=0;
	bool p=expresie();
	if (p)
		printf("1");
	else
		printf("0");
}

void initstr()
{
	for (int i=0;s1[i];++i)
	{
		if (s1[i]=='(' || s1[i]==')' || s1[i]=='1' || s1[i]=='0' || s1[i]=='|' || s1[i]=='&' || s1[i]=='!')
		{
			s[i]=s1[i];
			continue;
		}
		s[i]=valoare[s1[i]-'A']+'0';
	}
}

void rez()
{
	for (int i=0;i<m;++i)
	{
		valoare[ss[i]-'A']=!valoare[ss[i]-'A'];
		initstr();
		afis();
	}
}

int main()
{
	citire();
	rez();
	return 0;
}