Cod sursa(job #2265135)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 20 octombrie 2018 17:03:38
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <unordered_map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <iomanip>
#include <stack>
  
using namespace std;
 
ifstream cin("bool.in");
ofstream cout("bool.out");
 
string s;
 
int AND();
int NOT();
 
int i;
 
int val[300];
 
int OR()
{
	int r = AND();
	
	while(s[i] == '|')
	{
		i++;
		r |= AND();
	}
	
	return r;
}
 
int AND()
{
	int r = NOT();
	
	while(s[i] == '&')
	{
		i++;
		r &= NOT();
	}
	
	return r;
}
 
int NOT()
{
	int r = 0;
	
	if(s[i] == '(')
	{
		i++;
		r = OR();
		i++;
		return r;
	}
	else
		if(s[i] == '!')
		{
			i++;
			return !NOT();
		}
	
	i++;
	return val[s[i - 1]];
}
 
#define pb push_back
 
main()
{
	string t;
	getline(cin, t);
	
	for(int i = 0; i < t.size(); i++)
		if(t[i] != ' ')
		{
			if(t[i] == 'O' && i + 1 < t.size() && t[i + 1] == 'R')
			{
				s.pb('|');
				i++;
			}
			else
				if(t[i] == 'N' && i + 2 < t.size() && t[i + 1] == 'O' && t[i + 2] == 'T')
				{
					s.pb('!');
					i += 2;
				}
				else
					if(t[i] == 'A' && i + 2 < t.size() && t[i + 1] == 'N' && t[i + 2] == 'D')
					{
						s.pb('&');
						i += 2;
					}
					else
						if(t[i] == 'T' && i + 3 < t.size() && t[i + 1] == 'R' && t[i + 2] == 'U' && t[i + 3] == 'E')
						{
							s.pb('1');
							i += 3;
						}
						else
							if(t[i] == 'F' && i + 4 < t.size() && t[i + 1] == 'A' && t[i + 2] == 'L' && t[i + 3] == 'S' && t[i + 4] == 'E')
							{
								s.pb('0');
								i += 4;
							}
							else
								s.pb(t[i]);
		}
	
	val['1'] = 1;
	val['0'] = 0;
	
	int n;
	cin >> n;
	
	while(n--)
	{
		char c;
		cin >> c;
		
		val[c] ^= 1;
		i = 0;
		
		cout << OR();
	}
}