#include <iostream>
#include <string>
#include <vector>
using namespace std;
// We use 2D vectors for memoization.
// memoA[l][r] = Can Alice win if it's her turn on S[l...r]?
// memoB[l][r] = Can Alice win if it's Bob's turn on S[l...r]?
vector<vector<int>> memoA;
vector<vector<int>> memoB;
string S;
vector<int> prefixA, prefixB;
// Helper to count 'A's in S[l...r]
int countA(int l, int r) {
if (l > r) return 0;
return prefixA[r + 1] - prefixA[l];
}
// Helper to count 'B's in S[l...r]
int countB(int l, int r) {
if (l > r) return 0;
return prefixB[r + 1] - prefixB[l];
}
// Solves for memoB[l][r]
bool solveB(int l, int r);
// Solves for memoA[l][r] (Alice's turn)
bool solveA(int l, int r) {
if (l > r) {
return false; // Base case: Bob made the last move, Alice loses
}
if (memoA[l][r] != -1) {
return memoA[l][r];
}
// Check if Alice can move
if (countA(l, r) == 0) {
return memoA[l][r] = solveB(l, r); // Alice skips
}
// Alice wants to find *any* move that leads to a win (true).
// We can use the O(N^2) optimization:
// A_win[l][r] = (S[l] == 'A' ? B_win[l+1][r] : false) || A_win[l+1][r]
bool canWin = solveA(l + 1, r); // Result if she doesn't pick S[l]
if (S[l] == 'A') {
canWin = canWin || solveB(l + 1, r); // Result if she picks S[l]
}
return memoA[l][r] = canWin;
}
// Solves for memoB[l][r] (Bob's turn)
bool solveB(int l, int r) {
if (l > r) {
return true; // Base case: Alice made the last move, Alice wins
}
if (memoB[l][r] != -1) {
return memoB[l][r];
}
// Check if Bob can move
if (countB(l, r) == 0) {
return memoB[l][r] = solveA(l, r); // Bob skips
}
// Bob wants to find *any* move that leads to a loss for Alice (false).
// Alice only wins if *all* of Bob's moves lead to a win for her.
// B_win[l][r] = (S[r] == 'B' ? A_win[l][r-1] : true) && B_win[l][r-1]
bool canAliceWin = solveB(l, r - 1); // Result if Bob doesn't pick S[r]
if (S[r] == 'B') {
canAliceWin = canAliceWin && solveA(l, r - 1); // Result if Bob picks S[r]
}
return memoB[l][r] = canAliceWin;
}
string solve() {
int N;
cin >> N;
cin >> S;
// Initialize memoization tables with -1 (uncomputed)
memoA.assign(N, vector<int>(N, -1));
memoB.assign(N, vector<int>(N, -1));
// Precompute prefix sums for 'A' and 'B' counts
prefixA.assign(N + 1, 0);
prefixB.assign(N + 1, 0);
for (int i = 0; i < N; ++i) {
prefixA[i + 1] = prefixA[i] + (S[i] == 'A');
prefixB[i + 1] = prefixB[i] + (S[i] == 'B');
}
if (solveA(0, N - 1)) {
return "Alice";
} else {
return "Bob";
}
}
int main() {
int T;
cin >> T;
for (int i = 1; i <= T; ++i) {
cout << "Case #" << i << ": " << solve() << endl;
}
return 0;
}