#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
#define pi pair<int, int>
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define eb emplace_back
#define pb push_back
#define TASK " "
#define ms(a, x) memset(a, x, sizeof(a))
#define all(a) a.begin(), a.end()
#define All(a, n) a + 1, a + 1 + n
#define LOG 19
const int INF = 1e18;
const int mod = 1e9+7;
const int N = 2e5 + 5;
int MOD = 998244353;
int bit[200000];
struct node{
int kc, u, hk;
bool operator<(const node& other) const {
return kc > other.kc;
}
};
struct edge{
int u, v, w;
friend bool operator < (edge a, edge b){
return a.w < b.w;
}
};
void nhap(){
}
void solve(){
int n;
cin >> n;
vector<pi> a(n + 1);
for(int i = 1; i <= n; i++){
cin >> a[i].fi;
a[i].se = i;
}
sort(a.begin() + 1, a.end());
int cnt0 = 0;
for(int i = 1; i <= n; i++){
if(a[i].fi == 0) cnt0++;
}
if(cnt0 == 1){
cout << "NO" << nn;
return;
}
cout << "YES" << nn;
string ans(n, 'A');
vector<int> mex(3, 0);
for(int i = 1; i <= n; i++){
int id = 0;
if(mex[1] < mex[id]){
id = 1;
}
if(mex[2] < mex[id]){
id = 2;
}
if(id == 0){
ans[a[i].se - 1] = 'A';
}
else if(id == 1){
ans[a[i].se - 1] = 'B';
}
else{
ans[a[i].se - 1] = 'C';
}
if(a[i].fi == mex[id]){
mex[id]++;
}
}
cout << ans << nn;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgbm4gIlxuIgojZGVmaW5lIHBpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgVEFTSyAiICIKCiNkZWZpbmUgbXMoYSwgeCkgbWVtc2V0KGEsIHgsIHNpemVvZihhKSkKI2RlZmluZSBhbGwoYSkgYS5iZWdpbigpLCBhLmVuZCgpCiNkZWZpbmUgQWxsKGEsIG4pIGEgKyAxLCBhICsgMSArIG4KCiNkZWZpbmUgTE9HIDE5Cgpjb25zdCBpbnQgSU5GID0gMWUxODsKY29uc3QgaW50IG1vZCA9IDFlOSs3Owpjb25zdCBpbnQgTiA9IDJlNSArIDU7CmludCBNT0QgPSA5OTgyNDQzNTM7CmludCBiaXRbMjAwMDAwXTsKCnN0cnVjdCBub2RlewogICAgaW50IGtjLCB1LCBoazsKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IG5vZGUmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGtjID4gb3RoZXIua2M7CiAgICB9Cn07CgpzdHJ1Y3QgZWRnZXsKICAgIGludCB1LCB2LCB3OwogICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPCAoZWRnZSBhLCBlZGdlIGIpewogICAgICAgIHJldHVybiBhLncgPCBiLnc7CiAgICB9Cn07Cgp2b2lkIG5oYXAoKXsKCn0KCnZvaWQgc29sdmUoKXsKICAgIGludCBuOwogICAgY2luID4+IG47CiAgICB2ZWN0b3I8cGk+IGEobiArIDEpOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIGNpbiA+PiBhW2ldLmZpOwogICAgICAgIGFbaV0uc2UgPSBpOwogICAgfQogICAgc29ydChhLmJlZ2luKCkgKyAxLCBhLmVuZCgpKTsKICAgIGludCBjbnQwID0gMDsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICBpZihhW2ldLmZpID09IDApIGNudDArKzsKICAgIH0KICAgIGlmKGNudDAgPT0gMSl7CiAgICAgICAgY291dCA8PCAiTk8iIDw8IG5uOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvdXQgPDwgIllFUyIgPDwgbm47CiAgICBzdHJpbmcgYW5zKG4sICdBJyk7CiAgICB2ZWN0b3I8aW50PiBtZXgoMywgMCk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgaW50IGlkID0gMDsKCiAgICAgICAgaWYobWV4WzFdIDwgbWV4W2lkXSl7CiAgICAgICAgICAgIGlkID0gMTsKICAgICAgICB9CiAgICAgICAgaWYobWV4WzJdIDwgbWV4W2lkXSl7CiAgICAgICAgICAgIGlkID0gMjsKICAgICAgICB9CiAgICAgICAgaWYoaWQgPT0gMCl7CiAgICAgICAgICAgIGFuc1thW2ldLnNlIC0gMV0gPSAnQSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoaWQgPT0gMSl7CiAgICAgICAgICAgIGFuc1thW2ldLnNlIC0gMV0gPSAnQic7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGFuc1thW2ldLnNlIC0gMV0gPSAnQyc7CiAgICAgICAgfQogICAgICAgIGlmKGFbaV0uZmkgPT0gbWV4W2lkXSl7CiAgICAgICAgICAgIG1leFtpZF0rKzsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8IGFucyA8PCBubjsKfQoKc2lnbmVkIG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CgogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKCiAgICB3aGlsZSh0LS0pewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=