Cod sursa(job #2566637)

Utilizator recapitulareOJIScarlat Marius Stefan recapitulareOJI Data 2 martie 2020 22:40:51
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <string>

std::ifstream f("bool.in");
std::ofstream g("bool.out");

std::string s;
int t,i;
char var;
bool map[256];

bool expresieAnd(),expresieOr(),expresieXor(),factor();

void parseString(std::string& s){
    
    std::string sol = "";
    
    for(int i = 0;i < s.size();++i){
        
        if(s[i] == ' ')
            continue;
        
        if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D'){
            sol += "&";
            i += 2;
        }
        else if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T'){
            sol += "1^";
            i += 2;
        }
        else if(s[i] == 'O' && s[i + 1] == 'R'){
            sol += '|';
            i++;
        }
        
        else if(s[i] == 'T' && s[i + 1] == 'R'){
            sol += "1";
            i += 3;
        }
        
        else if(s[i] == 'F' && s[i + 1] == 'A'){
            sol += "0";
            i += 4;
        }
        
        else
            sol += s[i];
    }
    
    s = sol;
}

bool expresieOr(){
    
    bool r = expresieAnd();
    
    while(s[i] == '|'){
        i++;
        r |= expresieAnd();
    }
    
    return r;
}

bool expresieAnd(){
    
    bool r = expresieXor();
    
    while(s[i] == '&'){
        i++;
        r &= expresieXor();
    }
    
    return r;
}

bool expresieXor(){
    
    bool r = factor();
    
    while(s[i] == '^'){
        i++;
        r ^= factor();
    }
    
    return r;
}

bool factor(){
    
    bool r;
    
    if(s[i] == '('){
        i++;
        r = expresieOr();
        i++;
    }else{
        
        if(s[i] == '1'){
            i++;
            return true;
        }
        
        if(s[i] == '0'){
            i++;
            return false;
        }
        
        r = map[s[i]];
        i++;
    }
    
    return r;
}

int main(){
    
    std::getline(f,s);
    
    parseString(s);
    
    f >> t;
    
    while(t--){
        
        f >> var;
        
        i = 0;
        map[var] = 1 - map[var];
        
        g << expresieOr();
    }
    
    return 0;
}