Cod sursa(job #3337620)

Utilizator Vlad10Vlad Negut Vlad10 Data 29 ianuarie 2026 10:32:19
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
ifstream fin  ("bool.in");
ofstream fout ("bool.out");
string line0;
char line[1001];
int f[30][1001];
int p;

bool expresie();
bool factor();
bool AndFunction();
bool NotFunction();
bool expresie(){
    bool sum;
    sum = AndFunction();
    while(line[p] == '|'){
        if(line[p] == '|'){
            p++;
            sum=sum|AndFunction();
        }
    }
    return sum;
}
bool AndFunction(){
    bool sum;
    sum = factor();
    while(line[p] == '&'){
        if(line[p] == '&'){
            p++;
            sum=sum&factor();
        }
    }
    return sum;
}
bool factor(){
    bool val = 0, sign = 0;
    while(line[p] == '!'){
        sign = 1-sign;
        p++;
    }
    if(line[p] == '('){
        p++;
        val = expresie();
        p++;
        return val;
    }
    if(line[p] == '1'){
        val = 1;
        p++;
    }
    else if(line[p] == '0'){
        val = 0;
        p++;
    }
    if(sign  == 0)
        return val;
    return 1-val;
}
int main()
{
    getline(fin, line0);

    int i, n;
    i = 0;
    p = 0;
    n = line0.size();
    while(i<n){
        if (line0[i] == 'A' && line0[i+1] == 'N' && line0[i+2] == 'D') {
            line[p++] = '&';
            i += 2;
        }
        else if (line0[i] == 'O' && line0[i+1] == 'R') {
            line[p++] = '|';
            i += 1;
        }
        else if (line0[i] == 'N' && line0[i+1] == 'O' && line0[i+2] == 'T') {
            line[p++] = '!';
            i += 2;
        }
        else if (line0[i] == 'T' && line0[i+1] == 'R' &&
                 line0[i+2] == 'U' && line0[i+3] == 'E') {
            line[p++] = '1';
            i += 3;
        }
        else if (line0[i] == 'F' && line0[i+1] == 'A' &&
                 line0[i+2] == 'L' && line0[i+3] == 'S' &&
                 line0[i+4] == 'E') {
            line[p++] = '0';
            i += 4;
        }
        else if (line0[i] >= 'A' && line0[i] <= 'Z') {
            f[line0[i] - 'A'][0] ++;
            f[line0[i] - 'A'][f[line0[i] - 'A'][0]] = p;
            line[p++] = '0';
        }
        else if (line0[i] == '(' || line0[i] == ')') {
            line[p++] = line0[i];
        }
        i++;
    }
    int k;
    fin>>k;

    int ch;
    ch = fin.get();
    for(int i=1;i<=k;i++){
        ch = fin.get();
        for(int j = 1; j <=f[ch-'A'][0];j++){
            if(line[f[ch-'A'][j]] == '0')
                line[f[ch-'A'][j]] = '1';
            else{
                line[f[ch-'A'][j]] = '0';
            }
        }
        p = 0;
        fout<<expresie();
    }
    return 0;
}