Cod sursa(job #2216293)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 26 iunie 2018 12:03:32
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <bits/stdc++.h>
 
using namespace std;
    ifstream fin("bool.in");
    ofstream fout("bool.out");
string s,s1;
int t[250],n;
 
void eval()
{
    int l=s1.size();
    stack<char> ns;
    for (int i=0;i<l;i++)
        {
            if ((s1[i]>='A' && s1[i]<='Z') || (s1[i]>='a' && s1[i]<='b'))
                     ns.push(s1[i]);
            else if (s1[i]=='-')
            {
                char c=ns.top();
                ns.pop();
                if (1-t[c]==0) ns.push('a'); else ns.push('b');
            }
            else
            {
                char c=ns.top(),c1;
                ns.pop();
                c1=ns.top();
                ns.pop();
                if (s1[i]=='*')
                {
                    if (t[c]==0 || t[c1]==0) ns.push('a'); else ns.push('b');
                }
                else
                {
                    if (t[c]==1 || t[c1]==1) ns.push('b'); else ns.push('a');
                }
            }
        }
    fout<<t[ns.top()];
}
 
int prior (char c)
{
    if (c=='-') return 3;
    if (c=='*') return 2;
    if (c=='/') return 1;
    return -1;
}
 
int main()
{
 
    t['b']=1;
    //getline(fin,s);
    char ch;
    while (fin.get(ch))
    {
        if (ch == '\n')
            break;
        s += ch;
    }
    int l=s.size();
    stack<char> ss;
    ss.push('N');
    for (int i=0;i<l;i++)
    {
        if (s[i]=='A' && s[i+1]=='N')
        {
            while (prior(ss.top())>2)
            {
                s1+=ss.top();
                ss.pop();
            }
            ss.push('*');
            i+=2;
        }
        else if (s[i]=='N' && s[i+1]=='O')
        {
            while (prior(ss.top())>3)
            {
                s1+=ss.top();
                ss.pop();
            }
            ss.push('-');
            i+=2;
        }
        else if (s[i]=='O' && s[i+1]=='R')
        {
            while (prior(ss.top())>1)
            {
                s1+=ss.top();
                ss.pop();
            }
            ss.push('/');
            i+=1;
        }
        else if (s[i]=='(') ss.push('(');
        else if (s[i]==')')
        {
                 while (ss.top()!='(' && ss.top()!='N') {s1+=ss.top(); ss.pop();}
                 if (ss.top()=='(') ss.pop();
        }
        else if (s[i]=='T' && s[i+1]=='R') {s1+='b'; i+=3;}
        else if (s[i]=='F' && s[i+1]=='A') {s1+='a'; i+=4;}
        else if (s[i]>='A' && s[i]<='Z')
            s1+=s[i];
    }
    while (ss.top()!='N')
    {
        s1+=ss.top();
        ss.pop();
    }
 
    fin>>n;
    for (int j=1;j<=n;j++)
    {
        char c;
        fin>>c;
        t[c]=1-t[c];
        eval();
    }
    //fout<<s1;
    return 0;
}