Cod sursa(job #3244115)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 23 septembrie 2024 17:58:07
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
char sir[1002],s[1002],ch,stiva_semne[1002];
int b,a,i,j,k,n,q;
bool fr[28],nr,stiva_nr[1001];
int f (bool a,bool b,char ch)
{
    if (ch=='&')
        return a&&b;
    else
        return a||b;
}
int val (int ch)
{
    if (ch=='&')
        return 1;
    if (ch=='|')
        return 2;
    return 0;
}
bool expresie ()
{
    a=b=0;
    for (i=1; i<=n; i++)
    {
        if (sir[i]=='(')
            stiva_semne[++b]='(';
        else if (sir[i]==')')
        {
            while (stiva_semne[b]!='(')
            {
                stiva_nr[a-1]=f (stiva_nr[a-1],stiva_nr[a],stiva_semne[b]);
                a--;
                b--;
            }
            b--;
            while (stiva_semne[b]=='!')
            {
                stiva_nr[a]=1-stiva_nr[a];
                b--;
            }
        }
        else if (sir[i]>='A'&&sir[i]<='Z')
        {
            nr=fr[sir[i]-'A'+1];
            while (stiva_semne[b]=='!')
            {
                nr=1-nr;
                b--;
            }
            stiva_nr[++a]=nr;
        }
        else if (sir[i]=='0'||sir[i]=='1')
        {
            nr=sir[i]-'0';
            while (stiva_semne[b]=='!')
            {
                nr=1-nr;
                b--;
            }
            stiva_nr[++a]=nr;
        }
        else if (sir[i]=='!')
            stiva_semne[++b]='!';
        else
        {
            while (val (stiva_semne[b])>=val (sir[i]))
            {
                stiva_nr[a-1]=f (stiva_nr[a-1],stiva_nr[a],stiva_semne[b]);
                a--;
                b--;
            }
            stiva_semne[++b]=sir[i];
        }
    }
    while (b>0)
    {
        stiva_nr[a-1]=f (stiva_nr[a-1],stiva_nr[a],stiva_semne[b]);
        b--;
        a--;
    }
    return stiva_nr[1];
}
int main ()
{
    fin.getline (s,1002);
    fin>>q;
    n=strlen (s);
    for (i=0; i<n; i++)
    {
        if (s[i]=='A'&&s[i+1]=='N')
        {
            sir[++k]='&';
            i+=2;
        }
        else if (s[i]=='O'&&s[i+1]=='R')
        {
            sir[++k]='|';
            i++;
        }
        else if (s[i]=='N'&&s[i+1]=='O')
        {
            sir[++k]='!';
            i+=2;
        }
        else if (s[i]=='T'&&s[i+1]=='R')
        {
            sir[++k]='1';
            i+=3;
        }
        else if (s[i]=='F'&&s[i+1]=='A')
        {
            sir[++k]='0';
            i+=4;
        }
        else if (s[i]=='('||s[i]==')')
            sir[++k]=s[i];
        else if (s[i]>='A'&&s[i]<='Z')
            sir[++k]=s[i];
    }
    n=k;
    for (j=1; j<=q; j++)
    {
        fin>>ch;
        fr[ch-'A'+1]=1-fr[ch-'A'+1];
        fout<<expresie ();
    }
    return 0;
}