#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;
}