Cod sursa(job #253991)

Utilizator crisy_girlpop cristina crisy_girl Data 6 februarie 2009 13:59:50
Problema Episoade Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 2.85 kb
#include<stdio.h>
char R[1001];
int L,K,P1[1001],P2[1001],G[500][20],F[20][20],NG,N,VR[20];
int cifra(char c)
{
    int i=0;
    while ((i<=9)&&(i!=c))
      ++i;
    return i;
}
void gaseste(int le,int ri)
{
     ++NG;
     int j=1,t=0,ver=0,ver2=0;
     while (le<ri) 
     {
        int pr=0;
        if (le>2) if (R[le-2]==')') pr=1;
        if (R[le]=='(') 
        {
          le=P2[P1[K+j]]+1;
          if (ver)
          {
            ver=0;
            if (pr==0)
               for (int i=1;i<=G[NG-j][0];++i)
                   {
                   ++F[G[NG-j][i]][0];
                   F[G[NG-j][i]][F[G[NG-j][i]][0]]=G[NG][t];
                   }
            else
               for (int i=1;i<=G[NG-j][0];++i)
                   for (int a=1;a<=G[NG-j-1][0];++a)
                   {
                   ++F[G[NG-j][i]][0];
                   F[G[NG-j][i]][F[G[NG-j][i]][0]]=F[G[NG-j-1][a]][F[G[NG-j-1][a]][0]];
                   }
          }
          if (ver2)
          {
            ver2=0;
            for (int i=1;i<=G[NG-j][0];++i)
                F[G[NG-j][i]][1]=-(NG-j);
            for (int i=1;i<=G[NG-j-1][0];++i)
                F[G[NG-j-1][i]][1]=-(NG-j-1);
          }
          ++j;
        }
        else
        if ((R[le]!=')')&&(R[le]!='#')&&(R[le]!='>'))
        {
        int h;
        if ((R[le+1]!=')')&&(R[le+1]!='#')&&(R[le+1]!='>')) 
        {le+=2;h=2;++t;G[NG][t]=( (cifra(R[le-2])*10) + cifra(R[le-1]) );}
        else {++le;h=1;++t;G[NG][t]=cifra(R[le-1]);}
        if (ver)
        {
          if  (le>h+1) if (R[le-h-1]==')')
          {
          ver=0;
          for (int i=1;i<=G[NG-j][0];++i) 
          F[G[NG][t]][F[G[NG][t]][0]+i]=G[NG-j][i];
          F[G[NG][t]][0]+=G[NG-j][0];
          }
          if (ver)
          {++F[G[NG][t]][0];F[G[NG][t]][F[G[NG][t]][0]]=G[NG][t-1];ver=0;}
        }
        }
        else
        if (R[le]=='>') {ver=1;++le;}
        else
        {
        if ((R[le]=='#')&&(R[le-1]==')')&&(R[le+1]=='(')) ver2=1;
        ++le;
        }
     }
     G[NG][0]=t;
}
int main()
{
    freopen("episoade.in","r",stdin);
    freopen("episoade.out","w",stdout);
    fgets(R,1000,stdin);
    scanf("%d",&N,&L);
    int y=1;
    while (R[y])
    {
      if (R[y]=='(') {++K;P1[K]=y;}
      else if(R[y]==')') P2[P1[K]]=y;
      ++y;
    }
    --y;
    while (K>0) {gaseste(P1[K]+1,P2[P1[K]]-1);--K;}
    gaseste(1,y);
    for (int i=1;i<=N;++i)
    {
        int w=0,r=1;
        for (int y=1;y<=L;++y)
            scanf("%d",VR[y]);
        for (int y=1;y<=L,r<y;++y)
        {
            int r=1;
            if(F[VR[y]][1]>0)
            for (int j=1;j<=F[VR[y]][0],r!=y;++j)
                while((F[VR[y]][j]!=VR[r])&&(r<y))++r;
            if (r==y) w=1;
        }
        printf("%d\n",w);
    }        
    return 0;
}