Cod sursa(job #755176)

Utilizator danalex97Dan H Alexandru danalex97 Data 4 iunie 2012 21:13:40
Problema Episoade Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream F("episoade.in");
ofstream G("episoade.out");

#define Dmax 3011
#define Vmax 211

int Vect[Vmax],A[Vmax];
int A2[Vmax];
int Act,Sz;
int ActSize;

char Exp[Dmax];
int Par[Dmax];

char Ex[Dmax];
char Ex2[Dmax];
char Aux[Dmax];

int Size,Grad,L;
int It,Size2,GradMax;

int Q,N,P;

void Update()
{
	for (int i=1;i<=Size;++i)
		if ( Ex[i]=='(' )
		{
			++P;
			Par[i]=P;
		}
		else
			if ( Ex[i]==')' ) --P;
}

int gv_front(int Pos)
{
	++Pos;
	int Val=0;
	
	while ( Aux[Pos]>='0' && Aux[Pos]<='9' )
	{
		Val*=10;
		Val+=Aux[Pos]-'0';
		++Pos;
	}
	
	return Val;
}

int gv_back(int Pos)
{
	--Pos;
	int Val=0;
	int Pwr=1;
	
	while ( Aux[Pos]>='0' && Aux[Pos]<='9' )
	{
		Val+=(Aux[Pos]-'0')*Pwr;
		--Pos;
		Pwr*=10;
	}
	
	return Val;
}

void Insert(int X,char St[],int& Size)
{
	int Pwr=1;
	while ( Pwr <= X ) Pwr*=10;
	Pwr/=10;
	
	while ( Pwr )
	{
		St[++Size]='0'+X/Pwr;
		X%=Pwr;
		Pwr/=10;
	}
}

void GetSeqv()
{
	for (int i=1;i<=L;++i) Aux[i]=0;
	L=0;
	++It;
	while ( Ex[It]!=')' )
	{
		Aux[++L]=Ex[It];
		++It;
	}
}

bool Eval();

int main()
{
	F.getline(Exp,Dmax,'\n');
	
	Sz=strlen(Exp);
	for (int i=Sz;i;--i) Exp[i]=Exp[i-1];
	
	for (int i=1;i<=Sz;++i)
		if ( Exp[i]=='(' )
		{
			++P;
			GradMax=max(P,GradMax);
		}
		else
			if ( Exp[i]==')' ) --P;
	
	F>>Q>>ActSize;
	
	for (;Q;--Q)
	{
		for (int i=1;i<=ActSize;++i)
			F>>Vect[i];
		
		Act=ActSize;
		Grad=GradMax;
		Size=Sz;
		N=ActSize;
		
		for (int i=1;i<=Size;++i)
			Ex[i]=Exp[i];
		for (int i=1;i<=N;++i)
			A[i]=Vect[i];
		
		bool OK=1;
		
		for ( ;Grad && OK;--Grad )
		{
			Update();
			Size2=0;
			
			for (It=1;It<=Size && OK;++It)
				if ( Par[It]!=Grad )
					Ex2[++Size2]=Ex[It];
				else
				{
					GetSeqv();
					++Act;
					OK=Eval();
					Insert(Act,Ex2,Size2);
				}
			
			for (int i=1;i<=Size;++i)
			{	Ex[i]=0;
				Par[i]=0;
			}			
			for (int i=1;i<=Size2;++i)
			{	Ex[i]=Ex2[i];
				Ex2[i]=0;
			}
			Size=Size2;
		}
		
		if ( !OK )
			G<<OK<<'\n';
		else
		{
			++Act;
			Ex[++Size]=')';
			It=0;
			
			GetSeqv();
			OK=Eval();
		 
			G<<OK<<'\n';
		}
	}
}

bool Eval()
{
	int Next[Dmax]={0};
	int Back[Dmax]={0};
	int True[Vmax]={0};
	int Co=0;
	
	for (int i=1;i<=L;++i)
	{
		if ( Aux[i]=='#' || Aux[i]=='>' )
		{
			True[gv_back(i)]=1;
			True[gv_front(i)]=1;
			++Co;
		}
		if ( Aux[i]=='>' )
		{
			Next[gv_back(i)]=gv_front(i);
			Back[gv_front(i)]=gv_back(i);
		}
	}
	
	int i;
	++Co;
	
	for (i=1;!True[A[i]] && i<=N;++i);
	if ( i>N ) return 1;
	
	for (int Step=0;Step<Co;++Step)
	{
		if ( !True[A[i+Step]] ) return 0;
		if ( Next[A[i+Step-1]] && Next[A[i+Step-1]]!=A[i+Step]  ) return 0;
		if ( Back[A[i+Step]] && Back[A[i+Step]]!=A[i+Step-1]  ) return 0;
	}			
	
	int N2=0,Okk=0;
	for (int i=1;i<=N;++i)
		if ( !True[A[i]] )
			A2[++N2]=A[i];
		else
			if ( !Okk )
			{
				Okk=1;
				A2[++N2]=Act;
			}
	for (int i=1;i<=N;++i)
		A[i]=0;
	N=N2;
	for (int i=1;i<=N;++i)
	{	A[i]=A2[i];
		A2[i]=0;
	}
	
	return 1;
}