Pagini recente » Cod sursa (job #1532596) | Cod sursa (job #1738832) | Cod sursa (job #1943036) | Cod sursa (job #1453967) | Cod sursa (job #2916367)
#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;
}