Pagini recente » Cod sursa (job #3321583) | Cod sursa (job #1860865) | Cod sursa (job #984646) | Cod sursa (job #2004832) | Cod sursa (job #3337617)
#include <fstream>
#include <cmath>
#include <string>
#include <map>
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
const int N = 1e5;
string input;
int p;
map<char, bool> predef;
int expresie();
int factor();
int termen();
bool contains(char c) {
return predef.find(c) != predef.end();
}
int expresie()
{
bool exp_or = termen();
while (input[p] == '|')
{
p++;
exp_or = (termen() || exp_or);
}
return exp_or;
}
int termen()
{
bool exp_and = factor();
while (input[p] == '&')
{
p++;
exp_and = (factor() && exp_and);
}
return exp_and;
}
int factor() {
long long val = 0;
bool invers = false;
if (input[p] == '!') {
p++;
invers = !invers;
}
if (input[p] == '(')
{
p++;
val = expresie();
p++;
if (invers)
return !val;
return val;
}
while (input[p] == '0' || input[p] == '1')
{
val = (input[p] - '0');
p++;
}
while (input[p] >= 'A' && input[p] <= 'Z') {
if (contains(input[p])) {
val = predef[input[p]];
}
else {
val = false;
}
p++;
}
if (invers)
return !val;
return val;
}
string parse() {
string output = "";
string input;
string original;
getline(fin, original);
stringstream stream(original);
vector<string> v;
while (getline(stream, input, ' ')) {
v.push_back(input);
}
for (int i = 0; i < v.size(); i++) {
if (v[i] == "AND") {
output += '&';
}
else if (v[i] == "OR") {
output += '|';
}
else if (v[i] == "NOT") {
output += '!';
}
else if (v[i] == "TRUE") {
output += '1';
}
else if (v[i] == "FALSE") {
output += '0';
}
else if (v[i][0] == '(') {
string add = "";
int j = 0;
while (v[i][j] == '(') {
add += '(';
j++;
}
if (v[i][j] == 'T' && v[i][j+1] == 'R') {
add += '1';
j += 4;
}else if (v[i][j] == 'F' && v[i][j+1] == 'A') {
add += '0';
j += 4;
}
else {
add += v[i][j];
j++;
}
while (v[i][j] == ')') {
add += ')';
j++;
}
output += add;
}
else {
output += v[i];
}
}
return output;
}
int main()
{
input = parse();
cout << input;
int q;
fin >> q;
for (int i = 0; i < q; i++) {
p = 0;
char c;
fin >> c;
if (contains(c)) {
predef[c] = !predef[c];
}
else {
predef.insert(make_pair(c, true));
}
fout << expresie();
}
p = 0;
return 0;
}