Cod sursa(job #2752091)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 16 mai 2021 17:17:37
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;
char s[1001];
bool val[26];
char op[101];
void trans();
bool exp();
bool termen();
bool factor();
int i=0;
void trans()
{
	int cnt=0,i=0;
	while(s[i]!='\0')
	{
		if(s[i]=='T' and s[i+1]=='R')
		{
			s[cnt++]='1';
			i+=4;
		}
		else if(s[i]=='F' and s[i+1]=='A')
		{
			s[cnt++]='0';
			i+=5;
		}
		else if(s[i]=='N' and s[i+1]=='O')
		{
			s[cnt++]='!';
			i+=3;
		}
		else if(s[i]=='A' and s[i+1]=='N')
		{
			s[cnt++]='&';
			i+=3;
		}
		else if(s[i]=='O' and s[i+1]=='R')
		{
			s[cnt++]='|';
			i++;
			i++;
		}
		else if (s[i] != ' ')
        {
            s[cnt++] = s[i++];
        }
		else
			i++;
		
	}
	s[cnt]='\0';
}
bool exp()
{
	bool ori=termen();
	while(s[i]=='|')
	{
		i++;
		ori=(termen() || ori);
	}
	return ori;
}
bool termen()
{
	bool si=factor();
	while(s[i]=='&')
	{
		i++;
		si=(factor() && si);
	}
	return si;
}
bool factor()
{
	bool nope=false,flag;
	while(s[i]=='!')
	{
		i++;
		nope=(!nope);
	}
	if(s[i]=='(')
	{
		i++;
		flag=exp();
		i++;
		if(nope)
			return !flag;
		return flag;
	}
	if(s[i]=='0')
	{
		i++;
		flag =  false;
	}
	else if(s[i]=='1')
	{
		i++;
		flag= true;
	}
	else
	flag = val[s[i++]-'A'];
	if(nope)
		return !flag;
	return flag;
}
int main()
{
	ifstream cin("bool.in");
	ofstream cout("bool.out");
	cin.getline(s,1001);
	trans();
	int nop;
	cin>>nop;
	cin>>op;
	for(int j=0;j<nop;j++)
	{
		val[op[j]-'A'] = (!val[op[j] - 'A']);
		i=0;
		cout<<exp();
	}
}