Pagini recente » Istoria paginii runda/oni_2004/clasament | Cod sursa (job #2657250) | Cod sursa (job #2153177) | Cod sursa (job #284719) | Cod sursa (job #1741154)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream is("bool.in");
ofstream os("bool.out");
struct Nod{
string sign;
Nod* left;
Nod* right;
};
int n, poz;
bool var[26]; // variabilele
string s = "";
Nod* p;
const string signs[] = {"OR", "AND", "NOT", "TRUE", "FALSE"};
void Expresie(string s, Nod* p);
void RemoveSpaces(string& s);
bool RemoveBrackets(string& s);
int FindSign(string s, string sign); // returneaza pozitia primului semn care nu e in paranteza
bool Calculeaza(Nod*p);
int main()
{
getline(is, s);
RemoveSpaces(s);
p = new Nod;
Expresie(s, p);
is >> n;
is >> s;
for ( int i = 0; i < n; ++i )
{
var[s[i]-65] = !var[s[i]-65];
os << Calculeaza(p);
}
is.close();
os.close();
return 0;
}
void Expresie(string s, Nod* p)
{
string lstring, rstring;
while ( RemoveBrackets(s) ) ;
poz = FindSign(s, "OR");
p->left = new Nod;
p->right = new Nod;
if ( poz != -1 )
{
p->sign = "OR";
lstring = s.substr(0, poz);
rstring = s.substr(poz+2, s.size()-poz-2);
Expresie(lstring, p->left);
Expresie(rstring, p->right);
return;
}
poz = FindSign(s, "AND");
if ( poz != -1 )
{
p->sign = "AND";
lstring = s.substr(0, poz);
rstring = s.substr(poz+3, s.size()-poz-3);
Expresie(lstring, p->left);
Expresie(rstring, p->right);
return;
}
poz = FindSign(s, "NOT");
if ( poz != -1 )
{
p->sign = "NOT";
rstring = s.substr(poz+3, s.size()-poz-3);
p->left = 0;
Expresie(rstring, p->right);
return;
}
poz = FindSign(s, "TRUE");
if ( poz != -1 )
{
p->sign = "TRUE";
p->left = 0;
p->right = 0;
return;
}
//e litera
p->sign = s;
p->left = 0;
p->right = 0;
}
void RemoveSpaces(string& s)
{
for (int i = 0; i < s.size(); ++i )
if ( s[i] == ' ' )
{
s.erase(i, 1);
i++;
}
}
bool RemoveBrackets(string& s)
{
int brack = 0;
if ( s[0] != '(' || s[s.size()-1] != ')' )
return false;
for ( int i = 0; i < s.size()-1; ++i )
{
if ( s[i] == '(' )
brack++;
if ( s[i] == ')' )
brack--;
if ( brack == 0 )
return false;
}
s.erase(0, 1);
s.erase(s.size()-1, 1);
return true;
}
int FindSign(string s, string sign)
{
int brack = 0;
int aux = s.size()-sign.size();
for ( int i = 0; i <= aux;++i ) //WTF
{
if ( s[i] == '(' )
brack++;
if ( s[i] == ')' )
brack--;
if ( brack == 0 && sign.compare(s.substr(i, sign.size())) == 0 )
return i;
}
return -1;
}
bool Calculeaza(Nod*p)
{
if ( p->sign == "AND" )
return Calculeaza(p->left) && Calculeaza(p->right);
if ( p->sign == "OR" )
return Calculeaza(p->left) || Calculeaza(p->right);
if ( p->sign == "NOT" )
return !Calculeaza(p->right);
if ( p->sign == "TRUE" )
return true;
if ( p->sign == "FALSE" )
return false;
return var[p->sign[0]-65];
}