Cod sursa(job #2174532)

Utilizator sergiudnyTritean Sergiu sergiudny Data 16 martie 2018 12:27:42
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#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;
}