Cod sursa(job #1723064)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 29 iunie 2016 17:18:33
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <cstdio>
#include <algorithm>
#define Max_File_Size 6000000
#define INF 2000000005
using namespace std;
char File[Max_File_Size],Char,Queue[1005]={},Stack[1005];
int NumOfMod,Position=0,StackSize=0,QueueSize=0,SolveSize=0;
bool ValuesOfVariables[30]={},Solve[1005];
void ReadChar(char &Character)
{
    while(File[Position]<'A'||File[Position]>'Z')
    {
        if(File[Position]=='('||File[Position]==')')
        {
            Character=File[Position++];
            return;
        }
        Position++;
    }
    Character=File[Position++];
}
void ReadInt(int &Number)
{
    Number=0;
    while(File[Position]<'0'||File[Position]>'9')
        Position++;
    while(File[Position]>='0'&&File[Position]<='9')
        Number=Number*10+File[Position++]-'0';
}
void AddToQueue(char Ch)
{
	Queue[++QueueSize]=Ch;
}
char StackTop()
{
	return Stack[StackSize];
}
void AddToStack(char Ch)
{
	Stack[++StackSize]=Ch;
}
void AddToSolve(int Int)
{
	Solve[++SolveSize]=Int;
}
void DiscardFromStack()
{
	StackSize--;
}
void ExecuteOperator(char Operator)
{
	if(Operator=='!')
		Solve[SolveSize]=!Solve[SolveSize];
	else if(Operator=='|')
		Solve[SolveSize-1]|=Solve[SolveSize],SolveSize--;
	else if(Operator=='&')
		Solve[SolveSize-1]&=Solve[SolveSize],SolveSize--;
}
bool SolveExpression()
{
	SolveSize=0;
	int QueuePosition=1;
	for(int QueuePosition=1;QueuePosition<=QueueSize;QueuePosition++)
	{
		if(Queue[QueuePosition]>='A'&&Queue[QueuePosition]<='Z')
			AddToSolve(ValuesOfVariables[Queue[QueuePosition]-'A'+1]);
		else ExecuteOperator(Queue[QueuePosition]);
	}
	if(Solve[1]==0)
		return false;
	else return true;
}
int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout); 
    fread(File,1,Max_File_Size,stdin);
	while(File[Position]!='\n')
	{
		ReadChar(Char);
		if(Char>='A'&&Char<='Z'&&(File[Position]==' '||File[Position]==')'||File[Position]=='\n'))
			AddToQueue(Char);
		else if(Char=='T')
			AddToQueue('1'),Position+=3;
		else if(Char=='F')
			AddToQueue('0'),Position+=3;
		else if(Char=='N')
		{
			if(StackTop()=='!')
				DiscardFromStack();
			else
				AddToStack('!');
			Position+=2;
		}
		else if(Char=='O')
		{
			while(StackTop()=='&'||StackTop()=='|'||StackTop()=='!')
			{
				AddToQueue(StackTop());
				DiscardFromStack();
			}
			AddToStack('|');
			Position++;
		}
		else if(Char=='A')
		{
			while(StackTop()=='&'||StackTop()=='!')
			{
				AddToQueue(StackTop());
				DiscardFromStack();
			}
			AddToStack('&');
			Position+=2;
		}
		else if(Char=='(')
			AddToStack('(');
		else if(Char==')')
		{
			while(StackTop()!='(')
			{
				AddToQueue(StackTop());
				DiscardFromStack();
			}
			DiscardFromStack();
		}

	}
	while(StackSize>0)
	{
		AddToQueue(StackTop());
		DiscardFromStack();
	}
	ReadInt(NumOfMod);
	for(int i=1;i<=NumOfMod;i++)
	{
		ReadChar(Char);
		ValuesOfVariables[Char-'A'+1]=!ValuesOfVariables[Char-'A'+1];
		if(SolveExpression())
			printf("1");
		else printf("0");
	}
    return 0;
}