Cod sursa(job #1636963)

Utilizator delia_99Delia Draghici delia_99 Data 7 martie 2016 13:50:02
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
#define NMAX 1000
using namespace std;

char s[NMAX+5],modif[105];
int n,i,p,l,ord[130];
char semn[NMAX+5],post[NMAX+5];
vector <int> lit[30];
stack <int> sol;

void init()
{
    ord[')']=1;
    ord['|']=2;
    ord['&']=3;
    ord['!']=4;
    ord['(']=5;
    for(i=0; i<l; ++i)
        if(s[i]>='A' && s[i]<='Z')
            if((s[i+1]==' ' || s[i+1]==')') && (s[i-1]==' ' || s[i-1]=='('))
            {
                lit[s[i]-'A'].push_back(i);
                s[i]='0';
            }
    if(s[0]>='A' && s[0]<='Z' && s[1]==' ')
    {
        lit[s[0]-'A'].push_back(0);
        s[0]='0';
    }
}

void prel(int x)
{
    int dim=lit[x].size();
    for(int i=0; i<dim; ++i)
    {
        char c=s[lit[x][i]];
        if(c=='0')
            s[lit[x][i]]='1';
        else s[lit[x][i]]='0';
    }
}

int rez(int a,char op,int b)
{
    if(op=='|')
        return a|b;
    else return a&b;
}

void eval()
{
    int crt=0,crtp=0;
    char c;
    semn[++crt]='(';
    p=0;
    while(p<=l)
    {
        if(s[p]==' ')
        {
            ++p;
            continue;
        }
        if((s[p]!='1' && s[p]!='0' && s[p]!='T' && s[p]!='F'))
        {
            if(s[p]=='(' || s[p]==')')
                c=s[p++];
            else
            {
                if(s[p]=='A')
                {
                    p+=3;
                    c='&';
                }
                else
                {
                    if(s[p]=='O')
                    {
                        p+=2;
                        c='|';
                    }
                    else
                    {
                        p+=3;
                        c='!';
                    }
                }
            }
            while(semn[crt]!='(' && ord[c]<=ord[semn[crt]])
                post[++crtp]=semn[crt--];
            if(c==')')
                --crt;
            else semn[++crt]=c;
        }
        else
        {
            if(s[p]=='1' || s[p]=='0')
                post[++crtp]=s[p++];
            else
            {
                if(s[p]=='T')
                {
                    p+=4;
                    post[++crtp]='1';
                }
                else
                {
                    p+=5;
                    post[++crtp]='0';
                }
            }
        }
    }
    p=1;
    while(p<=crtp)
    {
        if(post[p]=='0' || post[p]=='1')
            sol.push(post[p]-'0');
        else
        {
            if(post[p]=='!')
            {
                int x=sol.top();
                sol.top()=!x;
            }
            else
            {
                int x=sol.top();
                sol.pop();
                sol.top()=rez(sol.top(),post[p],x);
            }
        }
        ++p;
    }
    printf("%d",sol.top());
    sol.pop();
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    gets(s);
    l=strlen(s);
    s[l]=')';
    init();
    scanf("%d\n",&n);
    gets(modif);
    for(i=0; i<n; ++i)
    {
        prel(modif[i]-'A');
        eval();
    }
    printf("\n");
    return 0;
}