Cod sursa(job #535753)

Utilizator Teodor94Teodor Plop Teodor94 Data 17 februarie 2011 18:46:34
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<cstdio>
#include<string>

const int N=1005;
const int M=30;

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

bool expresie();
bool termen();

void init()
{
	p=strtok(s,sep);
	while (p)
	{
		if (strcmp(p,"NOT")==0)
			strcat(s1,"!"),p=strtok(NULL,sep);
		else
		if (strcmp(p,"OR")==0)
			strcat(s1,"|"),p=strtok(NULL,sep);
		else
		if (strcmp(p,"AND")==0)
			strcat(s1,"&"),p=strtok(NULL,sep);
		else
			strcat(s1,p),p=strtok(NULL,sep);
	}
	int nr=0;
	for (int i=0;i<N;++i)
		s[i]=0;
	for (int i=0;s1[i];++i)
		if (s1[i]=='T' && s1[i+1]=='R')
		{
			s[nr++]='1';
			i+=3;
		}
		else
		if (s1[i]=='F' && s1[i+1]=='A')
		{
			s[nr++]='0';
			i+=4;
		}
		else
			s[nr++]=s1[i];
	for (int i=0;i<N;++i)
		s1[i]=0;
	for (int i=0;s[i];++i)
		if (s[i]!=' ')
			s1[n++]=s[i];
	for (int i=0;i<N;++i)
		s[i]=s1[i];
}

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

bool termen()
{
	bool val;
	if (s[poz]=='(')
	{
		++poz;
		val=expresie();
		++poz;
		return val;
	}
	bool ok=true;
	if (s[poz]=='!')
		ok=false,++poz;
	if (s[poz]>='A' && s[poz]<='Z')
		val=valoare[s[poz]-'A'],++poz;
	if (ok)
		return val;
	else
		return !val;
}

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

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

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

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