Mai intai trebuie sa te autentifici.
Cod sursa(job #2850126)
Utilizator | Data | 16 februarie 2022 12:01:05 | |
---|---|---|---|
Problema | Bool | Scor | 20 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 2.01 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
char t[1005], litere[30], s[1005], *p;
bool val[30];
int k, n;
bool eval();
bool termen();
bool factor();
void citire()
{
f.getline(t, 1005);
f >> n;
f.get();
f.getline(litere, 30);
}
void descifrare()
{
p = t;
strtok(t, " ");
while(p)
{
if (strcmp(p, "AND") == 0) strcat(s, "&");
else if(strcmp(p, "OR") == 0) strcat(s, "|");
else if(strcmp(p, "NOT") == 0) strcat(s, "!");
else if(strstr(p, "TRUE") != 0)
{
char *m = strstr(p, "TRUE");
strncat(s, p, m-p);
strcat(s, "1");
strcat(s, m+4);
}
else if(strstr(p, "FALSE") != 0)
{
char *m = strstr(p, "FALSE");
strncat(s, p, m-p);
strcat(s, "0");
strcat(s, m+5);
}
else strcat(s, p);
p = strtok(NULL, " ");
}
}
bool eval()
{
bool r;
r = termen();
while (*p == '|')
{
++p;
r |= termen();
}
return r;
}
bool termen()
{
bool r;
r = factor();
while (*p == '&')
{
++p;
r &= factor();
}
return r;
}
bool factor()
{
bool r;
if (*p == '!')
{
++p;
r =! factor();
}
else if (*p == '(')
{
++p;
r = eval();
++p;
}
else if (isalpha(*p))
{
r = val[litere[*p - 'A'] - 'A'];
++p;
}
else if (*p == '1')
{
++p;
r = true;
}
else if (*p == '0')
{
++p;
r = false;
}
return r;
}
int main()
{
citire();
descifrare();
for (int i = 0; i < n; ++i)
{
p = s;
if (val[litere[i]-'A'] == 0)
{
val[litere[i]-'A'] = 1;
}
else val[litere[i]-'A'] = 0;
g << eval();
}
return 0;
}