Problem: Vasya has a multiset s consisting of n integer numbers. Vasya calls some number x nice if it appears in the multiset exactly once. For example, multiset \{1, 1, 2, 3, 3, 3, 4\} contains nice numbers 2 and 4.

Vasya wants to split multiset s into two multisets a and b (one of which may be empty) in such a way that the quantity of nice numbers in multiset a would be the same as the quantity of nice numbers in multiset b (the quantity of numbers to appear exactly once in multiset a and the quantity of numbers to appear exactly once in multiset b).

Input

The first line contains a single integer n~(2 ≤ n ≤ 100).

The second line contains n integers s_1, s_2, ... s_n~(1 ≤ s_i ≤ 100) — the multiset s.

Output

If there exists no split of s to satisfy the given requirements, then print "NO" in the first line.

Otherwise print "YES" in the first line.

The second line should contain a string, consisting of n characters. i-th character should be equal to 'A' if the i-th element of multiset s goes to multiset a and 'B' if if the i-th element of multiset s goes to multiset b. Elements are numbered from 1 to n in the order they are given in the input.

If there exist multiple solutions, then print any of them.

Examples

Input

4
3 5 7 1


Output

YES
BABA


Input

3
3 5 1


Output

NO

Solution (in PYTHON3):

Solution:
from sys import stdin, stdout 
from bisect import bisect_left, bisect_right
from collections import defaultdict
import math
from fractions import Fraction as frac
from random import random
cin = stdin.readline
def cout(x):
	stdout.write(str(x)+'\n')
def var(type = int):
    return type(stdin.readline())
def readline(type = int):
    return map(type,stdin.readline().split())
def readlist(type = int):
    return list(map(type,stdin.readline().split()))
def sorted_indexes(arr):
    return sorted(range(len(arr)),key=arr.__getitem__)
def printr(arr):
    [stdout.write(str(x)+' ')   for x in arr]
    cout('')
def find_lt(a, x):#'Find rightmost value less than x'
    i = bisect_left(a, x)
    if i:
        return a[i-1]
    raise ValueError
def find_gt(a, x):#'Find leftmost value greater than x'
    i = bisect_right(a, x)
    if i != len(a):
        return a[i]
    raise ValueError
def dist(x,y):
    return math.sqrt(x*x + y*y)
def binary_search(arr, x):
    i = bisect_left(arr, x)
    if i == len(arr) or arr[i] != x:
        return -1
    return i
MOD2 = 998244353
# ---------------------Template ends-------------sdpt,sdpt131[Sudipta Banik]---------------------






n = var()
arr = readlist()
mp = {}
for el in arr:
    if el in mp:
        mp[el] +=1
    else:
        mp[el] = 1

count = 0
oddcount = 0
for key,val in mp.items():
    if val == 1:
        count +=1
    elif val > 2:
        oddcount = key

color = {}
if (count %2 == 0 ):
    k = 0
    for el,freq in mp.items():
        if freq > 1:
            color[el]='A'
        else:
            if k + k < count:
                color[el]='A'
            else:
                color[el]='B'
            k+=1
    
    print("YES")
    for i in arr:
        print(color[i],end='')

elif count%2 ==1 and oddcount > 0:
    k = 0
    xx = count//2 + 1
    for el,freq in mp.items():
        if freq > 1:
            color[el]='A'
        else:
            if k < xx:
                color[el]='A'
            else:
                color[el]='B'
            k+=1
    print("YES")
    for i in arr:
        if i == oddcount:
            print('B',end='')
            oddcount = 0
        
        else:
            print(color[i],end='')
else:
    print("NO")