Pagini recente » Cod sursa (job #165222) | Cod sursa (job #178735) | Cod sursa (job #1703755) | Cod sursa (job #2860284) | Cod sursa (job #2174532)
#include <bits/stdc++.h>
#define DM 10005
#define pb push_back
using namespace std;
ifstream fin("perle.in");
ofstream fout("perle.out");
vector<string>letter[3];
int v[DM],T,n,pas;
bool isDigit(char a){
return (a=='1' || a=='2' || a=='3');
}
int toDigit(char a){
return (a-'0');
}
bool ans(char l, int st, int dr){
int auxPas = ++pas;
if(dr<st) return 0;
//cout<<l<<" st="<<st<<" dr="<<dr<<'\n';
bool resp = 0;
if(dr==st){
if(l=='A') return 1;
if(l=='C' && v[st]==2) return 1;
return 0;
}
for(auto i:letter[l-'A']){ ///iei toate stringurile dintr-o litera
if(i.size()>dr-st+1 || (i.size()<dr-st+1 && isDigit(i.back()))) continue;
int good=0;
for(int j=0;j<i.size();++j){ ///parcurgi stringurile
//cout<<i<<" "<<j<<" "<<good<<'\n';
if(isDigit(i[j])){
if(toDigit(i[j])!=v[st+j]) break;
else good++;
} else {
if(i[j]=='A') good++;
if(i[j]=='B'){
if(l=='B') good+=ans('B',st+j,dr);
else if(l=='C'){
bool ok=0;
for(int k=1;k<=dr-st-2;++k){
ok=max(ok,min(ans('B',st+1,st+k),ans('C',st+k+1,dr)));
}
good+=ok;
}
}
if(i[j]=='C') if(l=='B'){
good+=ans('C',st+j,dr);
}
}
//fout<<"Indici "<<i<<" "<<j<<" "<<good<<'\n';
//fout<<"FINAL "<<auxPas<<" l="<<l<<" i="<<i<<" st="<<st<<" dr="<<dr<<" j="<<j<<" "<<" good="<<good<<" "<<i.size()<<'\n';
}
resp = max(resp,(good==i.size()));
if(resp==1) return 1;
}
//fout<<'\n';
return resp;
}
int main()
{
fin>>T;
letter[0].pb("1"),letter[0].pb("2"),letter[0].pb("3");
letter[1].pb("2B"),letter[1].pb("1A3AC");
letter[2].pb("2"),letter[2].pb("3BC"),letter[2].pb("12A");
while(T--){
fin>>n;
for(int i=1;i<=n;++i) fin>>v[i];
if(n==1){
fout<<1<<'\n';
return 0;
} else {
fout<<max(ans('B',1,n),ans('C',1,n))<<'\n';
}
}
return 0;
}