Pagini recente » Cod sursa (job #1943350) | Cod sursa (job #1513483) | Cod sursa (job #1085802) | Cod sursa (job #2177153) | Cod sursa (job #1723064)
#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;
}