Cod sursă (job #98800)

Utilizator avatar vladp Vlad Panait vladp IP ascuns
Problemă Bizar (clasele 9-10) Compilator cpp | 1.92 kb
Rundă Tema 10 clasele 9-10 2014/15 Status evaluat
Dată 16 dec. 2014 23:37:03 Scor 100
#include<cstdio>
#define MAX 100000
using namespace std;

int per[MAX+1];
int v[MAX+1];
int k;

char s[MAX+1];
int p;

void consume(int cat)
{
    int i=1,niv=1;

    while(i<cat)
    {
        while (s[p] == ' ')
            p++;
        if (s[p] == '(')
        {
            niv++;
            k++;
        }
        else if (s[p] == ')')
                niv--;
        else if (s[p] == ',' && niv == 1)
            i++;
        p++;
    }
}

void consume2()
{
    int niv=1;

    while(niv>0)
    {
        while(s[p] == ' ')
            p++;
        if (s[p] == '(')
        {
            niv++;
            k++;
        }
        else if (s[p]==')')
            niv--;
        p++;
    }
}

int counter()
{
    int val=0;

    while(s[p]==' ')
        p++;

    while(s[p] >= '0' &&s[p] <= '9')
    {
        val = val * 10 + s[p]- '0';
        p++;
        while(s[p] == ' ')
            p++;
    }

    return val;
}

int E()
{
    int val=counter();

    while(s[p]==' ') p++;

    while(s[p]=='(')
    {
        p++;
        while(s[p]==' ') p++;
        consume((val-1)%v[k]+1);
        k++;

        while(s[p]==' ') p++;

        val=E();

        while(s[p]==' ') p++;

        consume2();
    }

    return val;
}

int main()
{

    FILE *fin, *fout;

    fin=fopen("bizar.in","r");
    fout=fopen("bizar.out","w");


    int i,top;

    fgets(s,MAX,fin);

    p=0;
    k=0;

    for(i=1; i<=MAX/3; i++) v[i]=0;

    i=0;
    top=1;
    while(s[p]!='\0')
    {
        if ('('==s[p])
        {
            i=top;
            top++;
            k++;
            v[i]=1;
            per[k]=i;
        }
        else if (s[p]==')')
        {
            k--;
            i=per[k];
        }
        else if (s[p]==',') v[i]++;
        p++;
    }

    p=0;
    k=1;

    fprintf (fout,"%d",E());
    return 0;
}