Pagini recente » Cod sursa (job #1802492) | Cod sursa (job #1668462) | Cod sursa (job #1150316) | Cod sursa (job #2528679) | Cod sursa (job #256993)
Cod sursa(job #256993)
#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;
}