Cod sursa(job #2109574)

Utilizator ale.sicobeanAlexandra Sicobean ale.sicobean Data 19 ianuarie 2018 21:24:12
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005],r[105],t[1005],c[1005];
int n,ind;
int eval();
int factor();
int termen();
int eval()
{
    int nr=termen();
    while(s[ind]=='O' && s[ind+1]=='R')
    {
        ind+=3;
        nr=nr | termen();
    }
    return nr;
}
int termen()
{
    int nr=factor();
    while(s[ind]=='A' && s[ind+1]=='N' && s[ind+2]=='D')
    {
        ind+=4;
        nr=nr&factor();
    }
    return nr;
}
int factor()
{
    int nr;
    if(s[ind]=='(')
    {
        ++ind;
        nr=eval();
        ++ind;
    }
    else
    if(s[ind]=='N' && s[ind+1]=='O' && s[ind+2]=='T')
    {
        ind+=4;
        nr=!factor();
    }
    else
    if(s[ind]=='T' && s[ind+1]=='R' && s[ind+2]=='U' && s[ind+3]=='E')
    {
        ind+=5;
        nr=1;
    }
    else
    if(s[ind]=='F' && s[ind+1]=='A' && s[ind+2]=='L' && s[ind+3]=='S' && s[ind+4]=='E')
    {
        ind+=6;
        nr=0;
    }
    else
    {
        nr=t[s[ind]-'A'];
        ind+=2;
    }
    return nr;
}
int main()
{
    int i=-1,j=-1,x;
    fin.getline(s,1000);
    x=strlen(s);
    fin>>n;
    fin>>r;
    while(i<x)
    {
        i++;
        c[++j]=s[i];
        while(s[i]==s[i+1] && s[i+1]==' ' && i<x)
        {
            i++;
        }
    }
    c[++j]=0;
    strcpy(s,c);
    for(i=0;i<n;i++)
    {
        ind=0;
        t[r[i]-'A']=1-t[r[i]-'A'];
        fout<<eval();
    }
    return 0;
}