Cod sursa(job #406369)

Utilizator freak93Adrian Budau freak93 Data 1 martie 2010 14:40:24
Problema Episoade Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

const char iname[]="episoade.in";
const char oname[]="episoade.out";
const int maxn=1005;

char s[maxn];

int n,t,i,j,p,pos[maxn],ok,poz=0;

bool operator<(const pair<int,int> &a,const pair<int,int> &b)
{
    return a.first<b.first;
}

pair<int,int> eval(int nivel)
{
    if(nivel==0)
    {
        pair<int,int> r;
        vector<pair<int,int> > V;
        for(V.push_back(eval(nivel+1));s[poz]=='#';)
            ++poz,V.push_back(eval(nivel+1));
        sort(V.begin(),V.end());
        r=V[0];
        for(size_t i=1;i<V.size();++i)
            if(V[i].first!=V[i-1].second+1)
                ok=0;
            else
                r.second=V[i].second;
        return r;
    }
    if(nivel==1)
    {
        pair<int,int> r,aux;
        for(r=eval(nivel+1);s[poz]=='>';)
        {
            ++poz;
            if(r.second!=(aux=eval(nivel+1)).first-1)
                ok=0;
            r.second=aux.second;
        }
        return r;
    }
    if(s[poz]=='(')
    {
        ++poz;
        pair<int,int> r=eval(0);
        ++poz;
        return r;
    }
    int x=0;
    while(s[poz]>='0'&&s[poz]<='9')
        x=(x<<3)+(x<<1)+s[poz++]-'0';
    return make_pair(pos[x],pos[x]);
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    fgets(s,sizeof(s),stdin);
    scanf("%d%d",&t,&n);
    while(t--)
    {
        poz=0;
        for(i=1;i<=n;++i)
            scanf("%d",&j),pos[j]=i;
        ok=1;
        eval(0);
        printf("%d\n",ok);
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}