Cod sursa(job #2832832)
Utilizator | Data | 14 ianuarie 2022 13:34:09 | |
---|---|---|---|
Problema | Bool | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 4.55 kb |
#include <fstream>
#include <cstring>
using namespace std;
ifstream in ("bool.in");
ofstream out ("bool.out");
const int max_size = 1e3 + 1, max_f = 3e1;
char s[max_size], aux[max_size];
int p;
bool valori[max_f];
bool expresie();
bool termen();
bool expresie()
{
bool rez = termen();
while(s[p] == '&' || s[p] == '|')
{
if (s[p] == '&')
{
p++;
rez &= termen();
}
else
{
p++;
rez |= termen();
}
}
return rez;
}
bool termen ()
{
bool rez, semn = true;
while (s[p] == '!')
{
p++;
if (semn)
{
semn = false;
}
else
{
semn = true;
}
}
if (s[p] == '(')
{
p++;
rez = expresie();
p++;
if (semn)
{
return rez;
}
else
{
if (!rez)
{
return true;
}
else
{
return false;
}
}
}
if (isdigit(s[p]))
{
if (s[p] == '1')
{
rez = true;
}
else
{
rez = false;
}
}
else
{
rez = valori[s[p] - 'A'];
}
p++;
if (semn)
{
return rez;
}
else
{
if (!rez)
{
return true;
}
else
{
return false;
}
}
}
int main ()
{
in.getline(aux, max_size - 1);
for (int i = 0; i < strlen(aux); i++)
{
int iv = i;
if (aux[iv] == 'A')
{
if (iv + 2 < strlen(aux))
{
if (aux[iv + 1] == 'N' && aux[iv + 2] == 'D')
{
s[p++] = '&';
i += 2;
}
else
{
s[p++] = aux[iv];
}
}
else
{
s[p++] = aux[iv];
}
}
if (aux[iv] == 'O')
{
if (iv + 1 < strlen(aux))
{
if (aux[iv + 1] == 'R')
{
s[p++] = '|';
i++;
}
else
{
s[p++] = aux[iv];
}
}
else
{
s[p++] = aux[iv];
}
}
if (aux[iv] == 'N')
{
if (i + 2 < strlen(aux))
{
if (aux[iv + 1] == 'O' && aux[iv + 2] == 'T')
{
s[p++] = '!';
i += 2;
}
else
{
s[p++] = aux[iv];
}
}
else
{
s[p++] = aux[i];
}
}
if (aux[iv] == 'T')
{
if (iv + 3 < strlen(aux))
{
if (aux[iv + 1] == 'R' && aux[iv + 2] == 'U' && aux[iv + 3] == 'E')
{
s[p++] = '1';
i += 3;
}
else
{
s[p++] = aux[iv];
}
}
else
{
s[p++] = aux[iv];
}
}
if (aux[iv] == 'F')
{
if (iv + 4 < strlen(aux))
{
if (aux[iv + 1] == 'A' && aux[iv + 2] == 'L' && aux[iv + 3] == 'S' && aux[iv + 4] == 'E')
{
s[p++] = '0';
i += 4;
}
else
{
s[p++] = aux[iv];
}
}
else
{
s[p++] = aux[iv];
}
}
if (aux[iv] != 'A' && aux[iv] != 'O' && aux[iv] != 'N' && aux[iv] != 'T' && aux[iv] != 'F' && aux[iv] != ' ')
{
s[p++] = aux[iv];
}
}
int n;
in >> n;
for (int i = 1; i <= n; i++)
{
p = 0;
char ch;
in >> ch;
if (!valori[ch - 'A'])
{
valori[ch - 'A'] = true;
}
else
{
valori[ch - 'A'] = false;
}
out << expresie();
}
in.close();
out.close();
return 0;
}