Cod sursa(job #1571093)

Utilizator AndreiITCuriman Andrei AndreiIT Data 17 ianuarie 2016 09:49:56
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
const int MAX = 1005, MAXI = 105;
char s[MAX], a[MAXI], eval[MAX];
int n, nr_op, k, p;
int citire();
int factor();
int termen();
int expresie();
struct op
{
    char c;
    int val;
}v[1000];
int main()
{
    citire();
    for(int i=0; i<n; ++i)
    {
        int j;
        for(j=1; j<=nr_op; ++j)
            if(v[j].c == a[i])
            {
                v[j].val = (v[j].val + 1) % 2;
                cout<<expresie();
                break;
            }
    }
    return 0;
}
int citire()
{
    cin.getline(s, MAX);
    cin>>n;
    cin.get();
    cin.getline(a, MAXI);
    int k=-1;
    for(int i=0; s[i]; ++i)
    {
        if(isupper(s[i]))
        {
            char aux[4];
            int l=-1;
            while(isupper(s[i]))
            {
                aux[++l] = s[i];
                i++;
            }
            aux[++l]=NULL;
            if(strcmp(aux, "TRUE")==0)
                eval[++k] = '1';
            if(strcmp(aux, "FALSE")==0)
                eval[++k] = '0';
            if(strcmp(aux, "OR")==0)
                eval[++k] = '|';
            if(strcmp(aux, "AND")==0)
                eval[++k] = '&';
            if(strcmp(aux, "NOT")==0)
                eval[++k] = '!';
            if(l==1)
            {
                v[++nr_op].c = aux[0];
                eval[++k] = aux[0];
            }
        }
        if(s[i] == '(')
            eval[++k] = '(';
        if(s[i] == ')')
            eval[++k] = ')';
    }
}
int factor()
{
    int ans = 0;
    int semn = 1;
    if(eval[p] == '(')
    {
        p++;
        ans = expresie();
        p++;
    }
    else
    {
        if(eval[p] == '!')
        {
            ++p;
            semn = -1;
        }
        if(eval[p] == '1')
        {
            ++p;
            ans = 1;
            if(semn == 1)
                return ans;
            if(semn == -1)
                return !ans;
        }
        if(eval[p] == '0')
        {
            ++p;
            if(semn == 1)
                return ans;
            if(semn == -1)
                return !ans;
        }
        if(isupper(s[p]))
        {
            int i;
            for(i=1; i<=nr_op; ++i)
                if(v[i].c == eval[p])
                    break;
            ans = v[i].val;
            if(semn == 1)
                return ans;
            if(semn == -1)
                return !ans;
        }
    }
}
int expresie()
{
    int ans = factor();
    while(eval[p] == '&' or eval[p] == '|')
        if(eval[p] == '&')
        {
            p++;
            ans = ans & factor();
        }
        else
        {
            p++;
            ans = ans | factor();
        }
    return ans;
}