Cod sursa(job #1512986)

Utilizator DobosDobos Paul Dobos Data 28 octombrie 2015 21:09:25
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("bool.in");
ofstream fout("bool.out");
string s;
string ::iterator p;
bitset < 150 > val;

inline bool Adunare();
inline bool Imultire();
inline bool Element();

inline bool Adunare()
{
    bool x = Imultire();
    while(*p == '|' || *p == '&'){
        if(*p == '|'){
            p++;
            x = x | Imultire();
        } else {
            p++;
            x = x & Imultire();
        }
    }
    return x;
}
inline bool Imultire()
{
    bool x = 0;
    if(*p == '!')
    while(*p == '!'){
        p++;
        if(*p == '!')
            x = !x;
        else
        x |= !Element();
    }
    else
        x = Element();
    return x;
}
inline bool Element()
{
    bool x = 0;
    if(*p == '('){
        p++;
        x = Adunare();
        p++;
       }
    if((*p >= 'A' && *p <= 'Z') || *p == 't' || *p == 'f')
        x = val[*p],p++;
    return x;
}
int main()
{
    int n;
    char x;
    getline(fin ,s);
    p = s.begin();
    for(int i = 0; i < s.size(); i++){
        if(s[i] == ' ')
            s.erase(s.begin() + i);
        if(s[i] == 'A' && s[i+1] == 'N')
            s[i] = '&',s.erase(s.begin() + i + 1,s.begin() + i + 3);
        if(s[i] == 'N' && s[i+1] == 'O')
            s[i] = '!',s.erase(s.begin() + i + 1,s.begin() + i + 3);
        if(s[i] == 'O' && s[i+1] == 'R')
            s[i] ='|',s.erase(s.begin() + i + 1);
        if(s[i] == 'T' && s[i+1] == 'R')
            s[i] = 't',s.erase(s.begin() + i + 1,s.begin() + i + 4);
        if(s[i] == 'F' && s[i+1] == 'A')
            s[i] = 'f',s.erase(s.begin() + i + 1,s.begin() + i + 5);
    }
    val['t'] = 1;
   fin >> n ;
    for(int i = 1; i <= n; i++){
        fin >> x;
        val[x] = !val[x];
        p = s.begin();
        fout << Adunare();
    }

    return 0;
}