Cod sursa(job #2974838)

Utilizator DariusM17Murgoci Darius DariusM17 Data 4 februarie 2023 18:43:03
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("bool.in") ;
ofstream fout("bool.out") ;
string ss,s,modif ;
int n,j ;
bool val[120] ;
void simplifica()
{
    int i=0 ;
    while(i<ss.size())
    {
        if(ss[i]=='A' && ss[i+1]=='N') s+='&',i+=3 ;
        else if(ss[i]=='O' && ss[i+1]=='R') s+='|',i+=2 ;
        else if(ss[i]=='N' && ss[i+1]=='O') s+='!',i+=3 ;
        else if(ss[i]=='T' && ss[i+1]=='R') s+='1',i+=4 ;
        else if(ss[i]=='F' && ss[i+1]=='A') s+='0',i+=5 ;
        else if(ss[i]!=' ') s+=ss[i],i++ ;
        else i++ ;
    }
}
bool eval(),termen(),factor() ;
int main()
{
    getline(fin,ss) ;
    fin>>n>>modif ;
    simplifica() ;
    for(int i=0; i<modif.size(); ++i)
    {
        val[modif[i]]=!val[modif[i]],j=0 ;
        fout<<eval() ;
    }
    return 0;
}
bool eval()
{
    bool cnt=factor() ;
    while(s[j]=='|') j++,cnt|=factor() ;
    return cnt ;
}
bool factor()
{
    bool cnt=termen() ;
    while(s[j]=='&') j++,cnt&=termen() ;
    return cnt ;
}
bool termen()
{
    bool cnt,how=1 ;
    while(s[j]=='!') how=!how,j++ ;
    if(s[j]=='(')
    {
        j++,cnt=eval(),j++ ;
        if(!how) cnt=!cnt ;
        return cnt ;
    }
    if(s[j]=='1') cnt=1,j++ ;
    else if(s[j]=='0') cnt=0,j++ ;
    else if(isalpha(s[j])) cnt=val[s[j]],j++ ;
    if(!how) cnt=!cnt ;
    return cnt ;
}
/**

A AND ((B OR NOT C) OR ((TRUE)))

A&((B|!C)|((1)))

*/