Pagini recente » Istoria paginii runda/monthly-2014-runda-9/clasament | Cod sursa (job #1147538) | Cod sursa (job #1673000) | Cod sursa (job #2798907) | Cod sursa (job #2784272)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
vector<string> v;
string s;
int tokenizing ()
{
char cc;
getline(fin, s);
for (int i=0; i<s.size(); i++)
{
if (s[i]=='(')
v.push_back("(");
else if (s[i]==')')
v.push_back (")");
else if (s[i]==' ')
continue;
else
{
string cuv;
int j=i;
while (j<s.size() && s[j]!=' ' && s[j]!=')' && s[j]!='(')
{
cuv.push_back(s[j]);
j++;
}
i=j-1;
v.push_back(cuv);
}
}
/*for (int i=0; i<v.size(); i++)
{
if (v[i].size()==1 && v[i]!="(" && v[i]!=")")
v[i]="0";
else if (v[i]=="FALSE")
v[i]="0";
else if (v[i]=="TRUE")
v[i]="1";
else if (v[i]=="OR")
v[i]="||";
else if (v[i]=="AND")
v[i]="&&";
else if (v[i]=="NOT")
v[i]="!";
cout << v[i] << " ";
}*/
}
int i=0;
int vars[256]={0};
int solve_or();
int get_value()
{
int cc, ok=0;
while (v[i]=="NOT")
{
ok^=1;
i++;
}
if (v[i]=="(")
{
i++;
cc=solve_or();
i++;
}
else if (v[i]=="TRUE")
{
cc=1;
i++;
}
else if (v[i]=="FALSE")
{
cc=0;
i++;
}
else
{
cc=vars[v[i][0]];
}
if (ok==0)
return cc;
else
return cc^1;
}
int solve_and ()
{
int rez, cc1=get_value(), cc2;
if (i<v.size() && v[i]=="AND")
{
i++;
cc2=solve_and();
rez=cc1&cc2;
return rez;
}
return cc1;
}
int solve_or ()
{
int rez, cc1=solve_and(), cc2;
if (i<v.size() && v[i]=="OR")
{
i++;
cc2=solve_or();
rez=cc1|cc2;
return rez;
}
return cc1;
}
int main()
{
tokenizing();
int x;
string s;
fin >> x >> s;
for (int i=0; i<s.size(); i++)
{
vars[s[i]]^=1;
fout << solve_or();
}
return 0;
}