Cod sursa(job #253943)

Utilizator mariusdrgdragus marius mariusdrg Data 6 februarie 2009 13:47:09
Problema Episoade Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.08 kb
#include<stdio.h>
#include<string.h>

const int maxn = 10000;

int T,POZ,NR,C[maxn],OP[maxn],A[maxn],B[maxn];
char S[maxn];

int form(int &poz,int len)
{
	int cur = 0;
	for(;poz < len && S[poz] >= '0' && S[poz] <= '9';++poz)
	{
		cur *= 10;
		cur += S[poz] - '0';
	}
	return cur;
}

bool solve(int st,int dr)
{
	if (dr - st == 1) return true;	
	for(int i = st;i < dr; ++i)
	{
		if (OP[i] == 1) return solve(st,i) & solve(i + 1,dr);	
	}
	for(int i = st;i < dr; ++i)
	{
		if (C[i + 1] - C[i] != 1) return false;
	}
	return true;
}

int main()
{
	freopen("episoade.in","r",stdin);
	freopen("episoade.out","w",stdout);
	fgets(S,100000,stdin);
	int len = strlen(S) - 1;
	for(;POZ < len;)
	{
		A[++NR] = form(POZ,len);
		if (S[POZ] == '#') OP[NR] = 1;
			else OP[NR] = 2;
		++POZ;
        }
	scanf("%d %d\n",&T,&NR);
	for(int i = 1;i <= T; ++i)
	{
		for(int j = 1;j <= NR; ++j)
                {
                        int x = 0;
			scanf("%d ",&x);
                        B[x] = j;
                }
                for(int j = 1;j <= NR; ++j)
			C[j] = A[B[j]];
		printf("%d\n",solve(1,NR));
	}
	return 0;
}