Cod sursa(job #161745)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 18 martie 2008 19:15:54
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<fstream.h>
#include<string.h>
int a[30], v[1002], o[1002], k, l, n, m, i;
char c[1002], x[10], s;
ifstream f("bool.in");
ofstream g("bool.out");

void solve();
void det();
void calc();

int main()
{       int q;
	char w;
	f.getline(c, 1001, '\n');
	f>>n; f.get();
	for(q=0; q<n; q++)
	{       f.get(w);
		a[w-'A']=!a[w-'A'];
		solve();
	}
	g<<'\n';
	g.close();
	return 0;
}

void solve()
{       m=strlen(c);
	k=0; l=0;
	for(i=0; i<m;)
	{	det();
		switch(s)
		{	case 1:
				l++; o[l]=1; break;
			case 2:
				while(o[l]!=1 && l>0)
				{	calc(); l--;
				}
				l--; break;
			case 3:
			/*	while(o[l]==3 && l>0)
				{	calc(); l--;
				} */
				l++; o[l]=3; break;
			case 4:
				while((o[l]==3 || o[l]==4) && l>0)
				{	calc(); l--;
				}
				l++; o[l]=4; break;
			case 5:
				while(o[l]!=1 && l>0)
				{	calc(); l--;
				}
				l++; o[l]=5; break;
			case 6:
				k++; v[k]=1; break;
			case 7:
				k++; v[k]=0; break;
			default :
				k++; v[k]=a[s-'A']; break;
		}
	}
	while(l>0 && k>0)
	{       calc(); l--;
	}
	g<<v[1];
}

void calc()
{       if(k==1)
	{	if(l>0 && o[l]==3)
		{	v[k]=!v[k];
		}
		return;
	}
	switch(o[l])
	{       case 3:
			v[k]=!v[k]; break;
		case 4:
			v[k-1]=v[k] && v[k-1]; k--; break;
		case 5:
			v[k-1]=v[k] || v[k-1]; k--; break;
	}
}

void det()
{	int j=0;
	char x[10];
	if(c[i]=='(' || c[i]==')')
	{       x[j]=c[i]; j++; i++;
	}
	else
		while(c[i]!=' ' && c[i]!='(' && c[i]!=')' && i<m)
		{	x[j]=c[i]; i++; j++;
		}
	x[j]='\0';
	if(strcmp(x, "(")==0)
	{	s=1;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, ")")==0)
	{	s=2;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "NOT")==0)
	{	s=3;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "AND")==0)
	{	s=4;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "OR")==0)
	{	s=5;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "TRUE")==0)
	{	s=6;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "FALSE")==0)
	{	s=7;
		if(c[i]==' ')
			i++;
		return;
	}
	s=c[i-1];
	if(c[i]==' ')
		i++;
}