Cod sursa(job #256993)

Utilizator VmanDuta Vlad Vman Data 12 februarie 2009 17:19:29
Problema Episoade Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <cstdio>
#include <cstring>

#define Lmax 1024
#define Nmax 128
#define nrmax 1024

int T, N, L, i, poz;
char S[Lmax];
int A[Nmax];
int G[nrmax][Nmax], lG[nrmax], nrG;
int v1[nrmax], v2[nrmax], nrv;
char W[Nmax], p[Nmax], Gmax[nrmax], Gmin[nrmax];

int eval(int lvl)
{
 int g1, g2, last = 0, next, start = poz, i;

 while (S[poz] != ')')
    {
     if (S[poz] == '(')
        {
         ++poz;
         g1 = eval(lvl+1);
		 ++poz;
         last = 0;
        }
	 else
     if (S[poz] == '#') { last = 0;++poz; }
        else if (S[poz] == '>')
            {
             next = 0;
             ++poz;

             if (last)
                {
                 ++nrG;
                 G[nrG][ lG[nrG] = 1 ] = last;
                 g1 = nrG;
                }

             if (S[poz] == '(')
                {
				 ++poz;
				 g2 = eval(lvl+1);
                 ++poz;
                 v1[++nrv] = g1;
                 v2[nrv] = g2;
                 g1 = g2;
                 last = 0;
                 continue;
                }

             while (S[poz]>='0' && S[poz]<='9')
                {
                 next = next * 10 + S[poz]-'0';
                 ++poz;
                }
             ++nrG;
             G[nrG][ lG[nrG] = 1 ] = next;
             v1[++nrv] = g1;
             v2[nrv] = nrG;
             g1 = nrG;
             last = next;
            }
            else { last = last * 10 + S[poz]-'0'; ++poz; }
    }
 //grupul format de toate numerele de la inceput pana la sfarsit
 ++nrG;
 for (i=start, last=0; i<=poz; ++i)
    {
     if (S[i]>='0' && S[i]<='9') last = last * 10 + S[i]-'0';
        else if (last) { G[nrG][++lG[nrG]] = last; last = 0; }
    }
 return nrG;
}

void verifica()
{
 int i, j, k;
 //faza 1, toate grupurile formate sunt compacte
 for (i=1; i<=nrG; ++i)
    {
     memset(W, 0, sizeof(W));
     for (j=1; j<=lG[i]; ++j)
        W[ p[ G[i][j] ] ] = 1;
     for (j=1; j<=N && W[j]==0; ++j)
     Gmin[i] = j;
     for (k=j; k<=N && W[k]==1; ++k)
     Gmax[i] = k-1;
     if (k-j != lG[i])
        {
         printf("%d\n",0);
         return;
        }
    }
 //faza 2, ordinea este ok
 for (i=1; i<=nrv; ++i)
     if (Gmax[ v1[i] ] + 1 != Gmin[ v2[i] ])
        {
         printf("%d\n",0);
         return;
        }
 //okay
 printf("%d\n",1);
}

int main()
{
 freopen("episoade.in","r",stdin);
 freopen("episoade.out","w",stdout);

 scanf("%s\n", S);
 L = strlen(S);
 S[L] = ')';

 scanf("%d %d",&T, &N);

 poz = 0;
 eval(1);

 while (T)
    {
     --T;
     for (i=1; i<=N; ++i)
        {
         scanf("%d", &A[i]);
         p[A[i]] = i;
        }
     verifica();
    }

 return 0;
}