Pagini recente » Cod sursa (job #601460) | Cod sursa (job #2712801) | Cod sursa (job #3273533) | Cod sursa (job #1150339) | Cod sursa (job #755179)
Cod sursa(job #755179)
#include <fstream>
#include <cstring>
using namespace std;
ifstream F("episoade.in");
ofstream G("episoade.out");
#define Dmax 3011
#define Vmax 211
long long Vect[Vmax],A[Vmax];
long long A2[Vmax];
long long Act,Sz;
long long ActSize;
char Exp[Dmax];
long long Par[Dmax];
char Ex[Dmax];
char Ex2[Dmax];
char Aux[Dmax];
long long Size,Grad,L;
long long It,Size2,GradMax;
long long Q,N,P;
void Update()
{
for (long long i=1;i<=Size;++i)
if ( Ex[i]=='(' )
{
++P;
Par[i]=P;
}
else
if ( Ex[i]==')' ) --P;
}
long long gv_front(long long Pos)
{
++Pos;
long long Val=0;
while ( Aux[Pos]>='0' && Aux[Pos]<='9' )
{
Val*=10;
Val+=Aux[Pos]-'0';
++Pos;
}
return Val;
}
long long gv_back(long long Pos)
{
--Pos;
long long Val=0;
long long Pwr=1;
while ( Aux[Pos]>='0' && Aux[Pos]<='9' )
{
Val+=(Aux[Pos]-'0')*Pwr;
--Pos;
Pwr*=10;
}
return Val;
}
void Insert(long long X,char St[],long long& Size)
{
long long Pwr=1;
while ( Pwr <= X ) Pwr*=10;
Pwr/=10;
while ( Pwr )
{
St[++Size]='0'+X/Pwr;
X%=Pwr;
Pwr/=10;
}
}
void GetSeqv()
{
for (long long 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 (long long i=Sz;i;--i) Exp[i]=Exp[i-1];
for (long long 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 (long long i=1;i<=ActSize;++i)
F>>Vect[i];
Act=ActSize;
Grad=GradMax;
Size=Sz;
N=ActSize;
for (long long i=1;i<=Size;++i)
Ex[i]=Exp[i];
for (long long 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 (long long i=1;i<=Size;++i)
{ Ex[i]=0;
Par[i]=0;
}
for (long long 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()
{
long long Next[Dmax]={0};
long long Back[Dmax]={0};
long long True[Vmax]={0};
long long Co=0;
for (long long 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);
}
}
long long i;
++Co;
for (i=1;!True[A[i]] && i<=N;++i);
if ( i>N ) return 1;
for (long long 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;
}
long long N2=0,Okk=0;
for (long long i=1;i<=N;++i)
if ( !True[A[i]] )
A2[++N2]=A[i];
else
if ( !Okk )
{
Okk=1;
A2[++N2]=Act;
}
for (long long i=1;i<=N;++i)
A[i]=0;
N=N2;
for (long long i=1;i<=N;++i)
{ A[i]=A2[i];
A2[i]=0;
}
return 1;
}