#include #include #include #include #include #include #include #include #include #define fr(i,N) for(i = 0; i < (int)(N); i++) #define SZ(u) ((int)(u).size()) #define pb push_back #define MP make_pair #define F first #define S second using namespace std; typedef vector vi; typedef vector vvi; typedef pair p2; typedef long long ll; int R, C; char Board[300][300]; int Ids[300][300]; bool is_valid(int r, int c) { return 0 <= r && r < R && 0 <= c && c < C; } int bfs(int r, int c, int next_id) { vector que; int i, j; int dr[4] = {-1, 0, 1, 0}; int dc[4] = {0, 1, 0, -1}; que.pb(MP(r, c)); Ids[r][c] = next_id; int res = 0; fr (i, SZ(que)) { r = que[i].F, c = que[i].S; if (r == 0 || r == R - 1 || c == 0 || c == C - 1) res = -1; fr (j, 4) if (is_valid(r + dr[j], c + dc[j])) { int nr = r + dr[j], nc = c + dc[j]; if (next_id != -1) { if (Board[nr][nc] == 1 && Ids[nr][nc] == 0) { Ids[nr][nc] = next_id; que.pb(MP(nr, nc)); } } else { if (Board[nr][nc] == 0 && Ids[nr][nc] == 0) { Ids[nr][nc] = next_id; que.pb(MP(nr, nc)); } else if (Board[nr][nc] == 1) { if (res != -1) res = Ids[nr][nc]; } } } } return res; } int main() { int i, j, k, case_num = 0; char a; while (scanf("%d%d", &R, &C) == 2) { if (R == 0 && C == 0) break; case_num++; memset(Board, 0, sizeof(Board)); memset(Ids, 0, sizeof(Ids)); fr (i, R) fr (j, C) { scanf("%c", &a); int num = 0; if ('0' <= a && a <= '9') { num = a - '0'; } else if ('a' <= a && a <= 'z') { num = a - 'a' + 10; } else { j--; continue; } fr (k, 4) if ((1 << k) & num) { Board[i][(j + 1) * 4 - k - 1] = 1; } } C *= 4; int next_id = 1; vi scores; fr (i, R) fr (j, C) if (Board[i][j] && Ids[i][j] == 0) { bfs(i, j, next_id); next_id++; scores.pb(0); } fr (i, R) fr (j, C) if (Board[i][j] == 0 && Ids[i][j] == 0) { int tmp = bfs(i, j, -1); if (tmp != -1) scores[tmp - 1]++; } vector ans; fr (i, SZ(scores)) { if (scores[i] == 0) ans.pb('W'); else if (scores[i] == 1) ans.pb('A'); else if (scores[i] == 2) ans.pb('K'); else if (scores[i] == 3) ans.pb('J'); else if (scores[i] == 4) ans.pb('S'); else ans.pb('D'); } sort(ans.begin(), ans.end()); printf("Case %d: ", case_num); fr (i, SZ(ans)) printf("%c", ans[i]); printf("\n"); } return 0; }