Cod sursa(job #1823724)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 6 decembrie 2016 19:30:37
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <fstream>
#include <string.h>

using namespace std;

char s[1005];
char op[1005];
bool ap[26];

int OR(const int&, int&);
int AND(const int&, int&);
int NOT(const int&, int&);
int getNumber(const int&, int&);

int main(){
    ifstream fin("bool.in");
    ofstream fout("bool.out");
    fin.get(s + 1, 1005);
    int n = strlen(s + 1);
    int i,j;
    for(i = 1;i <= n;i++){
        if(s[i] == ' '){
            for(j = i;j < n;j++){
                s[j] = s[j + 1];
            }
            s[n] = '\0';
            n--;
        }
    }
    for(i = 1;i <= n;i++){
        if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D'){
            s[i] = '&';
            for(j = i + 1;j < n - 1;j++){
                s[j] = s[j + 2];
            }
            s[n] = '\0';
            s[n - 1] = '\0';
            n -= 2;
        }else if(s[i] == 'O' && s[i + 1] == 'R'){
            s[i] = '|';
            for(j = i + 1;j < n;j++){
                s[j] = s[j + 1];
            }
            s[n] = '\0';
            n--;
        }else if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T'){
            s[i] = '!';
            for(j = i + 1;j < n - 1;j++){
                s[j] = s[j + 2];
            }
            s[n] = '\0';
            s[n - 1] = '\0';
            n -= 2;
        }else if(s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E'){
            s[i] = '1';
            for(j = i + 1;j < n - 2;j++){
                s[j] = s[j + 3];
            }
            s[n] = '\0';
            s[n - 1] = '\0';
            s[n - 2] = '\0';
            n -= 3;
        }else if(s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E'){
            s[i] = '0';
            for(j = i + 1;j < n - 3;j++){
                s[j] = s[j + 4];
            }
            s[n] = '\0';
            s[n - 1] = '\0';
            s[n - 2] = '\0';
            s[n - 3] = '\0';
            n -= 4;
        }
    }
    int N;
    fin>>N;
    fin>>op + 1;
    for(i = 1;i <= N;i++){
        ap[op[i] - 'A'] ^= 1;
        j = 1;
        fout<<OR(n, j);
    }
    return 0;
}

int OR(const int& n, int& i){
    int ret = AND(n, i);
    while(i <= n && s[i] == '|'){
        i++;
        ret |= AND(n, i);
    }
    return ret;
}


int AND(const int& n, int& i){
    int ret = NOT(n, i);
    while(i <= n && s[i] == '&'){
        i++;
        ret &= NOT(n, i);
    }
    return ret;
}


int NOT(const int& n, int& i){
    int ret = 0;
    bool change = 0;
    while(s[i] == '!'){
        change ^= 1;
        i++;
    }
    if(s[i] == '('){
        i++;
        ret = OR(n, i);
        i++;
    }else{
        if(s[i] >= 'A' && s[i] <= 'Z'){
            ret = ap[s[i] - 'A'];
        }else{
            ret = s[i] - '0';
        }
        i++;
    }
    if(change){
        return ret ^ 1;
    }
    return ret;
}