Cod sursa(job #2018464)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 4 septembrie 2017 22:41:33
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <map>
#include <string>

using namespace std;

FILE *in,*out;

const int nmax = 1000;
const int tmax = 100;

map <char,bool> m;

char c[1+nmax+3],k[tmax+3];
char curchar;
int pointer;

bool OR();

bool NOT()
{
    bool answer = 0;
    if(c[pointer] == '(')
    {
        pointer ++;
        answer = OR();
        pointer ++;
    }
    else if(c[pointer] == 'T' && c[pointer + 1] == 'R')
    {
        pointer += 4;
        answer = 1;
    }
    else if(c[pointer] == 'F' && c[pointer + 1] == 'L')
    {
        pointer += 5;
        answer = 0;
    }
    else if(c[pointer] == 'N' && c[pointer + 1] == 'T')
    {
        pointer += 3;
        answer = 1 - NOT();
    }
    else
    {
        answer = m[c[pointer]];
        pointer ++;
    }
    return answer;

}

bool AND()
{
    bool answer = NOT();
    if(c[pointer] == 'A' && c[pointer+1] == 'N' && c[pointer+2] == 'D')
    {
        pointer += 3;
        answer = (answer && AND());
    }
    return answer;
}

bool OR()
{
    bool answer = AND();
    if(c[pointer] == 'O' && c[pointer+1] == 'R') {
        pointer += 2;
        answer = (answer || OR());
    }
    return answer;
}

int main()
{
    in = fopen("bool.in","r");
    out = fopen("bool.out","w");
    fgets(c,nmax+3,in);
    for(char i = 'A';i <= 'Z';i ++)
        m[i] = 0;
    int t;
    fscanf(in,"%d\n",&t);
    fgets(k,tmax+3,in);
    for(int i = 0;i < t;i ++)
    {
        m[k[i]] = 1 - m[k[i]];
        pointer = 0;
        fprintf(out,"%d",OR());
    }
    return 0;
}