Cod sursa(job #1838402)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 31 decembrie 2016 21:45:59
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
//de la 1 la 26 codurile literelor
//-1 and
//-2 or
//-3 not
//-10 (
//-11 )
char s[1005],c;
int l,i,t[1005],v,n,raspuns,j,term,op[1005];
bool val[30],sa[1005],ok[1005];
void calcul(int k)
{
    int no=0;
    ok[k]=1;
    while(j<=v)
    {
        if(t[j]==-3) {no=no^1;++j;}
        if(t[j]>=0)
        {
            if(no) {term=!val[t[j]];no=0;}
            else term=val[t[j]];
            if(ok[k]) {sa[k]=t[j];++j;ok[k]=0;continue;}
            else
            {
                ++j;
                if(op[k]==-1) sa[k]=sa[k]&term;
                else if(op[k]==2) sa[k]=sa[k]|term;
            }
        }
        if(t[j]==-10) {++j;calcul(k+1);}
        if(t[j]==-11)
        {
            ++j;
            if(op[k-1]==-1) sa[k-1]=sa[k-1]&sa[k];
            else sa[k-1]=sa[k-1]|sa[k];
            break;
        }
        ++j;
    }
}
int main()
{
    f.getline(s+1,1005);
    l=strlen(s+1);
    i=1;
    while(i<=l)
    {
        if(s[i]==' ') ++i;
        if(isalpha(s[i])&&!isalpha(s[i+1])) {t[++v]=s[i]-'A'+1;++i;continue;}
        if(s[i]=='T'&&s[i+1]=='R') {t[++v]=27;i=i+4;continue;}
        if(s[i]=='F'&&s[i+1]=='A') {t[++v]=28;i=i+5;continue;}
        if(s[i]=='A'&&s[i+1]=='N') {t[++v]=-1;i=i+3;continue;}
        if(s[i]=='O'&&s[i+1]=='R') {t[++v]=-2;i=i+2;continue;}
        if(s[i]=='N'&&s[i+1]=='O') {t[++v]=-3;i=i+3;continue;}
        if(s[i]=='(') {t[++v]=-10;++i;continue;}
        if(s[i]==')') {t[++v]=-11;++i;continue;}
    }
    f>>n;
    f.get();
    for(i=1;i<=n;++i)
    {
        f>>c;
        val[c-'A'+1]=1-val[c-'A'+1];
        j=1;
        calcul(1);
        g<<sa[1];
    }
    return 0;
}