Cod sursa(job #1856176)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 24 ianuarie 2017 16:58:43
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
using namespace std;
ifstream fi ("bool.in");
ofstream fo ("bool.out");
string s;
bool v[200];
int n,w,lg,i,j;
char chr;
bool litera(char c)
{
  return ((c>='A' and c<='Z') or (c>='a' and c<='z'));
}
bool litmic(char c)
{
  return (c>='a' and c<='z');
}
bool comanda(char c)
{
  return (c>='A' and c<='Z');
}
bool rec(int pos)
{
  int neg=0,k=0,p=0,el[1001],exp[1001];
  for (i=pos;i<=lg;i++)
  {
    if (litmic(s[i])) {k++;el[k]=(neg+v[s[i]])%2;neg=0;}
    if (comanda(s[i]))
    {
      if (s[i]=='N') {neg=(1+neg)%2;while (litera(s[i])) i++;i--;}
      else if (s[i]=='T') {k++;el[k]=(1+neg)%2;while (litera(s[i])) i++;i--;neg=0;}
      else if (s[i]=='F') {k++;el[k]=(0+neg)%2;while (litera(s[i])) i++;i--;neg=0;}
      else if (s[i]=='A') {p++;exp[p]=1;while (litera(s[i])) i++;i--;}
      else if (s[i]=='O') {p++;exp[p]=2;while (litera(s[i])) i++;i--;}
    }
    if (s[i]=='(') {k++;el[k]=(neg+rec(i+1))%2;neg=0;}
    if (s[i]==')')
    {
      for (j=1;j<k;j++)
      {
        if (exp[j]==1) el[j+1]=(el[j]+el[j+1]==2);
        else el[j+1]=(el[j]+el[j+1]>0);
 //       fo<<pos<<' '<<el[k]<<'\n';
      }
      i++;
      return (el[k]>0);
    }
  }
  if (k==1) return (neg+el[1])%2;
  for (j=1;j<k;j++)
      {
        if (exp[j]==1) el[j+1]=(el[j]+el[j+1]==2);
        else el[j+1]=(el[j]+el[j+1]>0);
      }
  return (el[k]>0);
}
int main()
{
    getline(fi,s);
    lg=s.size()-1;
    for (w=1;w<lg;w++)
      if (litera(s[w]) and !litera(s[w-1]) and !litera(s[w+1])) s[w]=s[w]-'A'+'a';
    if (litera(s[0]) and !litera(s[1])) s[0]=s[0]-'A'+'a';
    if (litera(s[lg]) and !litera(s[lg-1])) s[lg]=s[lg]-'A'+'a';
    fi>>n;
    for (w=1;w<=n;w++)
    {
      fi>>chr;
      chr=chr-'A'+'a';
      v[chr]=(1+v[chr])%2;
      fo<<rec(0);
    }
//    fo<<'\n'<<s;
    return 0;
}