Cod sursa(job #1563634)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 6 ianuarie 2016 13:31:35
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.9 kb
#include <fstream>
#include <string>
using namespace std;
string v;
char b[2000];
char s[500];
bool a[26];
bool c[500];
bool isOperator(int x)
{
    if((v[x] == 'A' && v[x+1] == 'N') || (v[x] == 'O' && v[x+1] == 'R') || (v[x] == 'N' && v[x+1] == 'O'))
        return true;
    else return false;
}
bool isOperator2(int x)
{
    if((b[x] == 'A' && b[x+1] == 'N') || (b[x] == 'O' && b[x+1] == 'R') || (b[x] == 'N' && b[x+1] == 'O'))
        return true;
    else return false;
}

int priority(char x)
{
    if(x == 'N')
        return 3;
    if(x == 'O')
        return 1;
    if(x == 'A')
        return 2;
    return 0;
}

int main()
{
    ofstream out("bool.out");
    ifstream in("bool.in");
    int n, j = 0, k = 0, z = 0;
    getline(in, v);
    for(int i = 0; i < v.size();)
    {
        if(v[i] == '(')
            s[k++] = v[i++];
        if(v[i] == 'T' && v[i+1] == 'R')
        {
            b[j++] = 'T';
            b[j++] = 'R';
            b[j++] = 'U';
            b[j++] = 'E';
            b[j++] = ' ';
            i+=4;
        }
        if(v[i] == 'F' && v[i+1] == 'A')
        {
            b[j++] = 'F';
            b[j++] = 'A';
            b[j++] = 'L';
            b[j++] = 'S';
            b[j++] = 'E';
            b[j++] = ' ';
            i+=5;
        }

        if(isOperator(i))
        {
            while(k!=0 && priority(s[k-1]) >= priority(v[i]))
            {
                k--;
                if(s[k] == 'N')
                {
                    b[j++] = 'N';
                    b[j++] = 'O';
                    b[j++] = 'T';
                    b[j++] = ' ';
                }
                if(s[k] == 'O')
                {
                    b[j++] = 'O';
                    b[j++] = 'R';
                    b[j++] = ' ';
                }
                if(s[k] == 'A')
                {
                    b[j++] = 'A';
                    b[j++] = 'N';
                    b[j++] = 'D';
                    b[j++] = ' ';
                }
            }
            s[k++] = v[i];
            if(v[i] == 'O') i--;
            i+=3;
        }
        else if(65 <=v[i] && v[i] <= 90)
        {
            b[j++] = v[i++];
            b[j++] = ' ';
        }
        if(v[i] == ')')
        {
            while(k!=0 && s[k-1]!='(')
            {
                k--;
                if(s[k] == 'N')
                {
                    b[j++] = 'N';
                    b[j++] = 'O';
                    b[j++] = 'T';
                    b[j++] = ' ';
                }
                if(s[k] == 'O')
                {
                    b[j++] = 'O';
                    b[j++] = 'R';
                    b[j++] = ' ';
                }
                if(s[k] == 'A')
                {
                    b[j++] = 'A';
                    b[j++] = 'N';
                    b[j++] = 'D';
                    b[j++] = ' ';
                }
            }
            k--;
            i++;
        }
        if(v[i] == ' ')
            i++;

    }
    while(k!=0)
    {
        k--;
        if(s[k]!='(')
        {
            if(s[k] == 'N')
            {
                b[j++] = 'N';
                b[j++] = 'O';
                b[j++] = 'T';
                b[j++] = ' ';
            }
            if(s[k] == 'O')
            {
                b[j++] = 'O';
                b[j++] = 'R';
                b[j++] = ' ';
            }
            if(s[k] == 'A')
            {
                b[j++] = 'A';
                b[j++] = 'N';
                b[j++] = 'D';
                b[j++] = ' ';
            }
        }
    }
    //out << j << "\n";
    //for(int i = 0; i<=j; i++)
       //out<<b[i];
    in >> n;
    //a['B'-'A'] = true;
    //a['C'-'A'] = true;
    for(int i = 1; i <= n; i++)
    {
        char t;
        in >> t;
        a[t-'A'] = not a[t-'A'];
        z = 0;
        for(int l = 0; l<=j;)
        {
            if(b[l] == 'T' && b[l+1] == 'R')
            {
                c[z++] = true;
                l+=4;
            }
            else if(b[l] == 'F' && b[l+1] == 'A')
            {
                c[z++] = true;
                l+=5;
            }
            else if(isOperator2(l))
            {
                if(b[l] == 'N')
                {
                    c[z-1] = not(c[z-1]);
                    l+=3;
                }
                if(b[l] == 'A')
                {
                    z--;
                    c[z-1] = c[z-1] and c[z];
                    l+=3;
                }
                if(b[l] == 'O')
                {
                    z--;
                    c[z-1] = c[z-1] or c[z];
                    l+=2;
                }
            }else if(65<=b[l] && b[l]<=90)
                c[z++] = a[b[l++]-'A'];
            else l++;

        }
        out << (int)c[0];
    }
}