Cod sursa(job #1574023)

Utilizator AndreiITCuriman Andrei AndreiIT Data 20 ianuarie 2016 08:30:38
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
const int MAX = 2005, MAXI = 2005;
char s[MAX], a[MAXI], *p;
int n;
bool var[500];
bool expresie();
bool termen();
bool factor();
int main()
{
    cin.get(s, MAX);
    cin>>n;
    int poz = 0, bune = 0;
    for(poz = 0; s[poz]; ++poz)
    {
        if(s[poz] == 'N' and s[poz+1] == 'O')
        {
            s[bune++] = '!';
            poz += 2;
            continue;
        }
        if(s[poz] == 'A' and s[poz+1] == 'N')
        {
            s[bune++] = '&';
            poz += 2;
            continue;
        }
        if(s[poz] == 'O' and s[poz+1] == 'R')
        {
            s[bune++] = '|';
            poz += 1;
            continue;
        }
        if(s[poz] == 'T' and s[poz+1] == 'R')
        {
            s[bune++] = '1';
            poz += 3;
            continue;
        }
        if(s[poz] == 'F' and s[poz+1] == 'A')
        {
            s[bune++] = '0';
            poz += 4;
            continue;
        }
        if(s[poz] == ' ') continue;
        s[bune++] = s[poz];
    }
    s[bune] = NULL;
    //cout<<s<<endl;
    for(int i=1; i<=n; ++i)
    {
        char ch; cin>>ch;
        var[ ch-'A' ] = ! var[ ch-'A' ];
        p = s;
        cout<<expresie();
    }
    return 0;
}
bool expresie()
{
    int ans = termen();
    int rez;
    while(*p == '|')
    {
        p++;
        rez = termen();
        ans = (ans or rez);
    }
    return ans;
}
bool termen()
{
    int ans = factor();
    int rez;
    while(*p == '&')
    {
        p++;
        rez = factor();
        ans = (ans and rez);
    }
    return ans;
}
bool factor()
{
    int ans;
    int rez;
    if(*p == '!')
    {
        p++;
        rez = expresie();
        return !rez;
        ///return !expresie();
    }
    if(*p == '(')
    {
        p++;
        ans = expresie();
        p++;
        return ans;
    }
    if(*p == '0' or *p == '1') {p++; return (*(p-1) - '0');}
    ans = var[*p - 'A'];
    p++;
    return ans;
}