Cod sursa(job #2916367)

Utilizator DavidLDavid Lauran DavidL Data 29 iulie 2022 15:19:04
Problema Perle Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("perle.in");
ofstream fo("perle.out");

int q;
int n;
string S;
bool ans;

string doarCifre(string s) {
    string ret;
    for (char x: s)
        if ('1' <= x && x <= '3')
            ret += x;
    return ret;
}

bool subsir(string a, string b) {
    // este a subsir al lui b?
    int curr = 0;
    for (char x: b)
        if (curr < a.size() && x == a[curr])
            curr++;
    return curr == a.size();
}

string aplica(string s, int poz, int tip) {
    string ret = "";
    ret += s.substr(0, poz);

    if (s[poz] == 'A') {
        char aux = '0' + tip;
        ret += aux;
    }
    else if (s[poz] == 'B') {
        if (tip == 1)
            ret += "2B";
        else
            ret += "1A3AC";
    }
    else {
        if (tip == 1)
            ret += "2";
        else if (tip == 2)
            ret += "3BC";
        else
            ret += "12A";
    }

    ret += s.substr(poz + 1, s.size() - poz - 1);

    return ret;
}

void bkt(string s) {
    if (s == S)
        ans = true;
    if (ans)
        return;

    if (s.size() > S.size())
        return;
    if (!subsir(doarCifre(s), S))
        return;

    for (int i = 0; i < s.size(); i++)
        if ('A' <= s[i] && s[i] <= 'C') {
            for (int tipOp = 1; tipOp <= 3; tipOp++) {
                if (s[i] == 'B' && tipOp == 3)
                    break;
                string nou = aplica(s, i, tipOp);
                bkt(nou);
            }
        }
}

int main()
{
    fi >> q;
    while (q--) {
        fi >> n;
        S.resize(n);
        for (int i = 0; i < n; i++)
            fi >> S[i];

        ans = false;

        bkt("A");
        bkt("B");
        bkt("C");

        fo << ans << "\n";
    }

    return 0;
}