Cod sursa(job #2529540)

Utilizator marius004scarlat marius marius004 Data 23 ianuarie 2020 17:11:11
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <iostream>
#include <fstream>
#include <string>
 
std::ifstream f("bool.in");
std::ofstream g("bool.out");
 
const int NMAX = 256;
int i,t,map[NMAX];
char variable;
std::string s;
 
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;
            continue;
        }
        
        if(s[i] == 'O' && s[i + 1] == 'R'){
            sol += "|";
            i += 1;
            continue;
        }
        
        if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T'){
            sol += "1^";
            i += 2;
            continue;
        }
        
        if(s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E'){
            sol += "1";
            i += 3;
            continue;
        }
        
        if(s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'E'){
            sol += "0";
            i += 3;
            continue;
        }
        
        sol += s[i];
    }
    
    s = sol;
}
 
bool expresieOr();
bool expresieAnd();
bool expresieNot();
bool factor();
 
bool expresieOr(){
    
    bool r = expresieAnd();
    
    while(s[i] == '|'){
        i++;
        r = (r | expresieAnd());
    }
    
    return r;
}
 
bool expresieAnd(){
    
    bool r = expresieNot();
    
    while(s[i] == '&'){
        i++;
        r = (r & expresieNot());
    }
    
    return r;
}
 
bool expresieNot(){
    
    bool r = factor();
    
    while(s[i] == '^'){
        i++;
        r = (r ^factor());
    }
    
    return r;
}
 
bool factor(){
    
    bool r = 0;
    
    if(s[i] == '('){
        i++;
        r = expresieOr();
        i++;
    }else{
        
        if(s[i] == '1'){
            i++;
            return 1;
        }
        
        if(s[i] == '0'){
            i++;
            return 0;
        }
        
        if( s[i] >= 'A' && s[i] <= 'Z'){
            r = map[s[i]];
            i++;
            return r;
        }
    }
    
    return r;
}
 
int main(){
    
    std::getline(f,s);
    
    parseString(s);// aduc expresia la o forma mai simpla decat cea initiala
    
    f >> t;
    
    while(t--){
        
        f >> variable;
        
        map[variable] = 1 - map[variable];
        i = 0;
        
        g << expresieOr();
    }
    
    return 0;
}