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 JAVA):

Solution:
import java.util.*;
import java.io.*;

public class VasyaAndMultisets {
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		//System.out.println("wow");
		int n = Integer.parseInt(scan.nextLine());
		//System.out.println("wow");
		StringTokenizer secondLine = new StringTokenizer(scan.nextLine());
		scan.close();
		HashMap<Integer, Integer> elements = new HashMap<Integer, Integer>();
		ArrayList<Integer> elementKeys = new ArrayList<Integer>();
		for(int i=0; i<n; ++i) {
			int element = Integer.parseInt(secondLine.nextToken());
			elementKeys.add(element);
			if(!elements.containsKey(element)) {
				elements.put(element, 1);
			}
			else {
				int newCount = elements.get(element) + 1;
				elements.put(element, newCount);
			}
		}
		//System.out.println(elements);
		HashSet<Integer> oneCount = new HashSet<Integer>();
		HashSet<Integer> threeCount = new HashSet<Integer>();
		for(int i=0;i<elementKeys.size();++i) {
			if(elements.get(elementKeys.get(i))==1) 
				oneCount.add(elementKeys.get(i));
			else if(elements.get(elementKeys.get(i))>2) 
				threeCount.add(elementKeys.get(i));
		}
		//System.out.println(oneCount);
		//System.out.println(threeCount);
		if(oneCount.size()%2==1&&threeCount.size()==0)
			System.out.println("NO");
		else if(oneCount.size()%2 == 0){
			System.out.println("YES");
			int count = 0;
			for(int i=0;i<n;++i) {
				if(!oneCount.contains(elementKeys.get(i))&&!threeCount.contains(elementKeys.get(i)))
					System.out.print("A");
				else if(threeCount.contains(elementKeys.get(i)))
					System.out.print("A");
				else {
					if(count%2==0)
						System.out.print("A");
					else
						System.out.print("B");
					count++;
				}
			}
		}
		else {
			System.out.println("YES");
			int count = 0;
			double oddOneOut = .5;
			for(int i=0;i<n;++i) {
				if(!oneCount.contains(elementKeys.get(i))&&!threeCount.contains(elementKeys.get(i)))
					System.out.print("A");
				else if(threeCount.contains(elementKeys.get(i))&&oddOneOut!=.5&&elementKeys.get(i)!=oddOneOut)
					System.out.print("A");
				else if(threeCount.contains(elementKeys.get(i))&&(oddOneOut==.5)) {
					System.out.print("B");
					oddOneOut = elementKeys.get(i);
				}
				else if(threeCount.contains(elementKeys.get(i))&&oddOneOut==elementKeys.get(i)) {
					System.out.print("A");
				}
				else {
					if(count%2==0)
						System.out.print("A");
					else
						System.out.print("B");
					count++;
				}
			}
		}
	}

}