Cod sursa(job #2527211)

Utilizator LorenaMariaHantig Lorena LorenaMaria Data 19 ianuarie 2020 20:05:14
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <cstring>
#include <map>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
int k,x;
char a[1001],b[1001];
map <char,bool> m;
bool expresie();
bool termen();
bool OR();
int main()
{ in.get(a,1005);
  int l=strlen(a);
  for(int i=0;i<l;i++)
  { if(a[i]==' ')
       strcpy(a+i,a+i+1),l--;
    if(a[i]>='a' && a[i]<='z')
       a[i]+=('A'-'a');
  }
  for(int i=0;i<l;i++)
  { if(a[i]==' ')
       strcpy(a+i,a+i+1),l--;
    if(a[i]=='N' && a[i+1]=='O' && a[i+2]=='T')
       a[i]='!',strcpy(a+i+1,a+i+3),l-=2;
    if(a[i]=='O' && a[i+1]=='R')
       a[i]='|',strcpy(a+i+1,a+i+2),l-=1;
    if(a[i]=='A' && a[i+1]=='N' && a[i+2]=='D')
       a[i]='&',strcpy(a+i+1,a+i+3),l-=2;
    if(a[i]=='T' && a[i+1]=='R' && a[i+2]=='U' && a[i+3]=='E')
       a[i]='1',strcpy(a+i+1,a+i+4),l-=3;
    if(a[i]=='F' && a[i+1]=='A' && a[i+2]=='L' && a[i+3]=='S' && a[i+4]=='E')
       a[i]='0',strcpy(a+i+1,a+i+5),l-=4;
  }
  for(int i=0;i<l;i++)
  { b[i]=a[i];
    if('A'<=b[i] && b[i]<='Z')
       m[b[i]]=0;
  }
  in>>k;
  for(int i=1;i<=k;i++)
  { char c;
    in>>c;
    m[c]=!m[c];
    for(int i=0;i<l;i++)
      if('A'<=b[i] && b[i]<='Z')
         a[i]=(char)(m[b[i]]+'0');
    x=0;
    out<<expresie();
  }
  in.close();
  out.close();
  return 0;
}
bool expresie()
{ bool r=termen();
  while(a[x]=='&' || a[x]=='|')
  { x++;
    if(a[x-1]=='&')
       r=r&expresie();
    else if(a[x-1]=='|')
       r=r|OR();
  }
  return r;
}
bool OR()
{ bool r=termen();
  while(a[x]=='&')
  { x++;
    if(a[x-1]=='&')
       r=r&expresie();
  }
  return r;
}
bool termen()
{ if(a[x]=='!')
  { x++;
    return !termen();
  }
  bool k=0;
  if(a[x]=='(')
  { x++;
    k=expresie();
    x++;
  }
  else
    k=a[x]-'0',x++;
  return k;
}