Cod sursa(job #1722570)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 28 iunie 2016 14:01:39
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <algorithm>
#define MAX 6000000
#define INF 2000000005
using namespace std;
char f[MAX],C;
int pos=0,Exp[10005]={},P=0,N;
int values[30]={};
void r(int &nr)
{
    nr=0;
    while(f[pos]<'0'||f[pos]>'9')
		pos++;
    while(f[pos]>='0'&&f[pos]<='9')
        nr=nr*10+f[pos++]-'0';
}
void rch(char &ch)
{
    while(f[pos]<'A'||f[pos]>'Z')
    {
		if(f[pos]=='('||f[pos]==')')
		{
			ch=f[pos++];
			return;
		}
		pos++;
	}
    ch=f[pos++];
}
int Analyse (int first,int second,int criteria,int second_sign)
{
	if(second_sign==1)
		second=!second;
	if(criteria==-3)
		return first|second;
	else return first&second;
}
int Analyse_Expresion(int &val)
{
	int NT=0;
	int expval=1,comp=-4;
		for(int j=val+1;j<=P;j++)
		{
			if(Exp[j]>0&&Exp[j]<=26)
				expval=Analyse(expval,values[Exp[j]],comp,NT),NT=0;
			else if(Exp[j]==100)
				expval=Analyse(expval,Analyse_Expresion(j),comp,NT),NT=0,val=j;
			else if(Exp[j]==-2)
				expval=Analyse(expval,1,comp,NT),NT=0;
			else if(Exp[j]==-1)
				expval=Analyse(expval,0,comp,NT),NT=0;
			else if(Exp[j]==-4||Exp[j]==-3)
				comp=Exp[j];
			else if(Exp[j]==-5)
				NT=!NT;
			else if(Exp[j]==-100)
			{
				val=j;
				return expval;
			}
		}
	return expval;
}
int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout); 
	fread(f,1,MAX,stdin);
	while(f[pos]!='\n')
	{
		rch(C);
		if(C=='(')
			Exp[++P]=100;
		else if(C==')')
			Exp[++P]=-100;
		else if(f[pos]==' '||f[pos]==')')
			Exp[++P]=C-'A'+1;
		else if(f[pos]!=' '&&f[pos]!=')')
		{
			if(C=='F')
				Exp[++P]=-1,pos+=3;
			else if(C=='T')
				Exp[++P]=-2,pos+=3;
			else if(C=='O')
				Exp[++P]=-3,pos+=1;
			else if(C=='A')
				Exp[++P]=-4,pos+=2;
			else if(C=='N')
				Exp[++P]=-5,pos+=2;
		}
	}
	r(N);
	for(int i=1;i<=N;i++)
	{
		int start=0;
		rch(C);
		values[C-'A'+1]=!values[C-'A'+1];
		printf("%d",Analyse_Expresion(start));
	}
	return 0;
}