Cod sursa(job #1855731)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 23 ianuarie 2017 21:34:52
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <map>
using namespace std;
FILE *f=fopen("bool.in","r");
FILE *g=fopen("bool.out","w");
map<char,bool> val;
char C[1005];
int ind=1;
int N;
char V[105];
int getnextop()
{
    while(C[ind]==' ')
        ind++;
    if(C[ind]=='O'&&C[ind+1]=='R')
        {return 1;}
    if(C[ind]=='A'&&C[ind+1]=='N')
        {return 2;}
    if(C[ind]=='N'&&C[ind+1]=='O')
        {return 3;}
    return 0;
}
bool legor();
bool legand();
bool getterm()
{
    while(C[ind]==' ')
    {
        ind++;
    }
    if(C[ind]=='(')
        {ind++;return legor();}
    if(C[ind]=='F'&&C[ind+1]=='A')
    {
        ind+=5;
        return 0;
    }
    if(C[ind]=='T'&&C[ind+1]=='R')
    {
        ind+=4;
        return 1;
    }
    if(C[ind+1]==' '||C[ind+1]==')'||C[ind+1]=='('||C[ind+1]=='\0'||C[ind+1]=='\n')
    {
        ind+=2;
        return val[C[ind-2]];
    }
    bool tmp=0;
    while(getnextop()==3)
    {
        ind+=3;
        tmp^=1;
        while(C[ind]==' ')
        {
            ind++;
        }
        if(C[ind]=='(')
            {ind++;return tmp^legor();}
        if(C[ind]=='F'&&C[ind+1]=='A')
        {
            ind+=5;
            return tmp;
        }
        if(C[ind]=='T'&&C[ind+1]=='R')
        {
            ind+=4;
            return tmp^1;
        }
        if(C[ind+1]==' '||C[ind+1]==')'||C[ind+1]=='('||C[ind+1]=='\0'||C[ind+1]=='\n')
        {
            ind+=2;
            return tmp^val[C[ind-2]];
        }
    }
}
bool legand()
{
    bool val=getterm();
    while(getnextop()==2)
    {
        ind+=3;
        val=val&getterm();
    }
    return val;
}
bool legor()
{
    bool val=legand();
    while(getnextop()==1)
    {
        ind+=2;
        val=val|legand();
    }
    return val;
}
int main()
{
    fgets(C+1,1005,f);
    fscanf(f,"%d\n",&N);
    fgets(V+1,105,f);
    for(int i=1;i<=N;i++)
    {
        val[V[i]]^=1;
        ind=1;
        fprintf(g,"%d",legor());
    }
    fclose(f);
    fclose(g);
    return 0;
}