Cod sursa(job #1307170)
Utilizator | Data | 1 ianuarie 2015 14:52:54 | |
---|---|---|---|
Problema | Range minimum query | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 7.21 kb |
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<bitset>
#include<string>
using namespace std;
bitset<26> v;
string e;
int i,x;
bool parant()
{
++i;
bool b;
if(e[i]=='!')
{
++i;
if(e[i]!='(')
{
if(e[i]=='1') b=0;
else
if(e[i]=='0') b=1;
else b=!v[e[i]-'A'];
++i;
}
else b=!parant();
}
else
if(e[i]!='(')
{
if(e[i]=='1') b=1;
else
if(e[i]=='0') b=0;
else b=v[e[i]-'A'];
++i;
}
else b=parant();
if(e[i]==')')
{
++i;
return b;
}
char o1;
o1=e[i];
++i;
bool c;
if(e[i]=='!')
{
++i;
if(e[i]!='(')
{
if(e[i]=='1') c=0;
else
if(e[i]=='0') c=1;
else c=!v[e[i]-'A'];
++i;
}
else c=!parant();
}
else
if(e[i]!='(')
{
if(e[i]=='1') c=1;
else
if(e[i]=='0') c=0;
else c=v[e[i]-'A'];
++i;
}
else c=parant();
bool d;
char o2;
for(;e[i]!=')';)
{
o2=e[i];
++i;
if(e[i]=='!')
{
++i;
if(e[i]!='(')
{
if(e[i]=='1') d=0;
else
if(e[i]=='0') d=1;
else d=!v[e[i]-'A'];
++i;
}
else d=!parant();
}
else
if(e[i]!='(')
{
if(e[i]=='1') d=1;
else
if(e[i]=='0') d=0;
else d=v[e[i]-'A'];
++i;
}
else d=parant();
if(o1=='&')
{
b=b&&c;
o1=o2;
c=d;
}
else
{
if(o2=='&') c=c&&d;
else
{
b=b||c;
o1=o2;
c=d;
}
}
}
if(o1=='&') b=b&&c;
else b=b||c;
++i;
return b;
}
int main()
{
FILE* si=fopen("bool.in","r");
FILE* so=fopen("bool.out","w");
char a;
string s="";
while(1)
{
fscanf(si,"%c",&a);
if(a==10) break;
else
{
if(a!=' '&&a!='('&&a!=')') s=s+a;
else
{
if(a==' ')
{
if(s!="")
{
if(s=="TRUE") e=e+'1';
else if(s=="FALSE") e=e+'0';
else if(s=="AND") e=e+'&';
else if(s=="OR") e=e+'|';
else if(s=="NOT") e=e+'!';
else
{
a=s[0];
e=e+a;
}
}
s="";
}
else
if(a=='(')e=e+'(';
else
{
if(s!="")
{
if(s=="TRUE") e=e+'1';
else if(s=="FALSE") e=e+'0';
else if(s=="AND") e=e+'&';
else if(s=="OR") e=e+'|';
else if(s=="NOT") e=e+'!';
else
{
a=s[0];
e=e+a;
}
}
s="";
e=e+')';
}
}
}
}
if(s!="")
{
if(s=="TRUE") e=e+'1';
else if(s=="FALSE") e=e+'0';
else if(s=="AND") e=e+'&';
else if(s=="OR") e=e+'|';
else if(s=="NOT") e=e+'!';
else
{
a=s[0];
e=e+a;
}
}
///................................
int n;
fscanf(si,"%i%*c",&n);
x=e.length();
while(n--)
{
fscanf(si,"%c",&a);
if(v[a-'A']==0) v[a-'A']=1;
else v[a-'A']=0;
bool b;
i=0;
if(e[i]=='!')
{
++i;
if(e[i]!='(')
{
if(e[i]=='1') b=0;
else
if(e[i]=='0') b=1;
else b=!v[e[i]-'A'];
++i;
}
else b=!parant();
}
else
if(e[i]!='(')
{
if(e[i]=='1') b=1;
else
if(e[i]=='0') b=0;
else b=v[e[i]-'A'];
++i;
}
else b=parant();
char o1;
if(i<x)
{
o1=e[i];
bool c;
++i;
if(e[i]=='!')
{
++i;
if(e[i]!='(')
{
if(e[i]=='1') c=0;
else
if(e[i]=='0') c=1;
else c=!v[e[i]-'A'];
++i;
}
else c=!parant();
}
else
if(e[i]!='(')
{
if(e[i]=='1') c=1;
else
if(e[i]=='0') c=0;
else c=v[e[i]-'A'];
++i;
}
else c=parant();
bool d;
char o2;
for(;i<x;)
{
o2=e[i];
++i;
if(e[i]=='!')
{
++i;
if(e[i]!='(')
{
if(e[i]=='1') d=0;
else
if(e[i]=='0') d=1;
else d=!v[e[i]-'A'];
++i;
}
else d=!parant();
}
else
if(e[i]!='(')
{
if(e[i]=='1') d=1;
else
if(e[i]=='0') d=0;
else d=v[e[i]-'A'];
++i;
}
else d=parant();
if(o1=='&')
{
b=b&&c;
o1=o2;
c=d;
}
else
{
if(o2=='&') c=c&&d;
else
{
b=b||c;
o1=o2;
c=d;
}
}
}
if(o1=='&') b=b&&c;
else b=b||c;
}
if(b) fprintf(so,"1");
else fprintf(so,"0");
}
}