Cod sursa(job #1161288)

Utilizator cypry97Dascalitei Ciprian cypry97 Data 31 martie 2014 10:03:07
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;

FILE *in,*out;

struct op
{
    int pos,pr;
    char tip;
};

int n,l,k,nr;
char s[1001];
bool e[510];
bool e2[510];
short a[26][500];
op v[510];

bool cmp(op a, op b)
{
    return a.pr>b.pr;
}

void citire()
{
    in=fopen("bool.in","r");
    fgets(s,1001,in);
    fscanf(in,"%d",&n);
    l=strlen(s);
}

void expr()
{
    int p=0;
    int i=0;
    int pos=0;
    while(i<l)
    {
        if(isalpha(s[i]))
        {
            if(isalpha(s[i+1]))
            {
                if(s[i]=='N')
                {
                    v[++k].pos=pos;
                    v[k].pr=p+3;
                    v[k].tip='n';
                    i+=2;
                }
                else if(s[i]=='A')
                {
                    v[++k].pos=pos;
                    v[k].pr=p+2;
                    v[k].tip='a';
                    i+=2;
                }
                else if(s[i]=='O')
                {
                    v[++k].pos=pos;
                    v[k].pr=p+1;
                    v[k].tip='o';
                    i+=2;
                }
                else if(s[i]=='T')
                {
                    e[++nr]=1;
                    i+=3;
                    pos++;
                }
                else
                {
                    e[++nr]=1;
                    i+=4;
                    pos++;
                }
            }
            else
            {
                e[++nr]=0;
                pos++;
                a[s[i]-'A'][++a[s[i]-'A'][0]]=pos;
            }
        }
        else
        {
            if(s[i]=='(')
                p+=5;
            else if(s[i]==')')
                p-=5;
        }
        i++;
    }
    sort(v+1,v+k+1,cmp);
}

void rezolva()
{
    out=fopen("bool.out","w");
    int i,j;
    char c;
    fscanf(in,"%c",&c);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%c",&c);
        for(j=1;j<=a[c-'A'][0];j++)
            e[a[c-'A'][j]]=!e[a[c-'A'][j]];
        for(j=1;j<=nr;j++)
            e2[j]=e[j];
        for(j=1;j<=k;j++)
        {
            if(v[j].tip=='n')
                e2[v[j].pos+1]=!e2[v[j].pos+1];
            else if(v[j].tip=='a')
            {
                e2[v[j].pos]=(e2[v[j].pos]&&e2[v[j].pos+1]);
                e2[v[j].pos+1]=e2[v[j].pos];
            }
            else
            {
                e2[v[j].pos]=(e2[v[j].pos]||e2[v[j].pos+1]);
                e2[v[j].pos+1]=e2[v[j].pos];
            }
        }
        fprintf(out,"%d",e2[v[k].pos+1]);
    }
}

int main()
{
    citire();
    expr();
    rezolva();
    return 0;
}