Cod sursa(job #2320310)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 14 ianuarie 2019 17:05:43
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin ("bool.in");
ofstream cout ("bool.out");
char s[1003];
int v[1000];
int p;
bool expresie();
bool termen();
bool factor();
bool expresie ()
{
    int sum=termen();
    while(s[p]=='|')
    {
        ++p;
        sum|=termen();
    }
    return sum;
}
bool termen ()
{
    int sum=factor();
    while(s[p]=='&')
    {
        ++p;
        sum&=factor();
    }
    return sum;
}
bool factor ()
{
    int sum=0,val=0;
    while(s[p]=='-')
    {
        ++sum;
        ++p;
    }
    if(s[p]=='(')
    {
        ++p;
        sum+=expresie();
        ++p;
   //     sum+=val;
        return sum%2;
    }
    sum+=v[s[p]-'A'];
    ++p;
   /* while(s[p]>='0' && s[p]<='9')
    {
        val=val*10+(s[p]-'0');
        ++p;
    }*/
    return sum%2;
}
int main()
{
    long long r,i,cur=0,cnt=0,inmul,imp=2,k=-1;
    cin.getline(s,1000);
    int n=strlen(s);
    v['Z'-'A'+1]=1;
    for(i=0;i<n;++i)
    {
        if(s[i]=='T' && s[i+1]=='R')
            s[++k]='Z'+1;
        else
        if(s[i]=='F' && s[i+1]=='A')
            s[++k]='Z'+2;
        else
        if(s[i]=='N' && s[i+1]=='O')
            s[++k]='-';
        else
        if(s[i]=='A' && s[i+1]=='N')
            s[++k]='&';
        else
        if(s[i]=='O' && s[i+1]=='R')
            s[++k]='|';
        else
        if((s[i]<'A' || s[i]>'Z') && s[i]!=' ')
            s[++k]=s[i];
        else
        if(s[i]>='A' && s[i]<='Z' && (i==0 || ((s[i-1]<'A' || s[i-1]>'Z') && s[i-1]!='-' && s[i-1]!='|' && s[i-1]!='&')))
            s[++k]=s[i];
    }
    for(i=k+1;i<n;++i)
        s[i]=0;
  //  cout<<s<<'\n';
    n=k;
    int m;
    cin>>m;
    for(i=1;i<=m;++i)
    {
        char c;
        cin>>c;
        c-='A';
        ++v[c];
        v[c]&=1;
        p=0;
        cout<<expresie();
    }
}