Cod sursa(job #1882720)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 17 februarie 2017 13:58:52
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0);
#define tie cin.tie(0);
#define mp make_pair
#define ll long long
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define zeros(x) ( (x ^ (x - 1)) & x )
   
using namespace std;
  
int n, cnt;
string s;
char rs[1005], c, poz[1005];
bool u[400];
 
bool evaluate(int p);
bool ter(int p);
 
bool fac(int p)
{
    bool r;
    if (rs[p] == '!') ++p, r = !evaluate(p);
    else if (rs[p] == '(') ++p, r = evaluate(p), ++p;
    else if (rs[p] == '0' || rs[p] == '1') r = rs[p] - '0'; 
    return r;
}
 
bool ter(int p)
{
    bool r = fac(p);
    while (rs[p] == '&') if (rs[p] == '&') ++p, r &= fac(p);
    return r;
}
 
 
bool evaluate(int p)
{
    bool r = ter(p);
    while (rs[p] == '|')
        if (rs[p] == '|') ++p, r |= ter(p);
    return r;
}
int main(){
    //IOS tie
    ifstream cin("bool.in");
    ofstream cout("bool.out");
    getline(cin, s);
    for (int i = 0; i < s .size(); i++)
    {
        if (s[i] == ' ') continue;
        else if (s[i] == 'O' && s[i+1] == 'R') rs[++cnt] = '|', i += 1;
        else if (s[i] == 'A' && s[i+1] == 'N') rs[++cnt] = '&', i += 2;
        else if (s[i] == 'N' && s[i+1] == 'O') rs[++cnt] = '!', i += 2;
        else if (s[i] == 'T' && s[i+1] == 'R') rs[++cnt] = '1', i += 3;
        else if (s[i] == 'F' && s[i+1] == 'A') rs[++cnt] = '0', i += 4;
        else if (s[i] == '(' || s[i] == ')') rs[++cnt] = s[i];
        else rs[++cnt] = '0', u[s[i]] = 0, poz[cnt] = s[i];
    }
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> c;
        u[c] = !u[c];
        for (int i = 1; i <= cnt; i++)
            if (poz[i] == c) rs[i] = u[c] + '0';
        int p = 1;
        bool rsp = evaluate(p);
        cout << rsp;
    }
    cerr << "Fucking time elapsed: " << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
    return 0;
}