Pagini recente » Cod sursa (job #2056845) | Cod sursa (job #2702433) | Cod sursa (job #2064176) | Cod sursa (job #858238) | Cod sursa (job #755170)
Cod sursa(job #755170)
#include <fstream>
#include <cstring>
using namespace std;
ifstream F("episoade.in");
ofstream G("episoade.out");
#define Dmax 2011
#define Vmax 111
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<=Size2;++i)
Ex[i]=Ex2[i];
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;
}
N=N2;
for (int i=1;i<=N;++i)
A[i]=A2[i];
return 1;
}