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.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Solution {
    static PrintWriter fop = new PrintWriter(System.out);







    public static void main(String[] args) {
        FastScanner fsca = new FastScanner();

        int  n = fsca.nextInt() ;
        int a[] = fsca.readArray(n) ;
        int dp[] = new int[110] ;

        for (int i = 0; i <n ; i++) {
            dp[a[i]]++ ;
        }
        int cnt = 0 ;
        for (int i = 0; i <105 ; i++) {
            if (dp[i] ==1 )cnt++ ;
        }
        if (cnt%2 == 0){
            fop.append("YES\n") ;
            boolean tt = true ;
            for (int i = 0; i <n ; i++) {
                if (dp[a[i]] == 1 ){
                    if (tt){
                        fop.append("A") ;
                        tt = false ;
                    }
                    else {
                        fop.append("B") ;
                        tt = true ;
                    }
                }
                else fop.append("B") ;
            }

        }
        else {
            int tt = -1 ;
            for (int i = 0; i <105 ; i++) {
                if (dp[i] >=3){
                    tt = i ;
                    break;
                }
            }

            if (tt == -1)
                System.out.println("NO");
            else {
                char prev = 'z' ;
                fop.append("YES\n") ;
                boolean flag = true ;
                boolean f2 = true ;
                for (int i = 0; i <n ; i++) {
                    if (dp[a[i]] == 1 ){
                        if (f2){
                            fop.append("A") ;
                            f2 = false ;
                        }
                        else {
                            fop.append("B") ;
                            f2 = true ;
                        }
                    }
                    else if (a[i] == tt & flag){
                        flag = false ;
                        if (f2){
                            fop.append("A") ;
                            f2 = false ;
                            prev = 'B' ;
                        }
                        else {
                            fop.append("B") ;
                            f2 = true ;
                            prev = 'A' ;
                        }
                    }
                    else if (a[i] == tt){
                        fop.append(prev) ;
                    }
                    else
                        fop.append("B") ;

                }



            }
        }











        fop.flush();
        fop.close();


    }
    /*-----------------------------------------------------------------------------------------------------------------------------------------------*/


    static long gcd(long a, long b) {
        return (b == 0) ? a : gcd(b, a % b);
    }

    ;

    static int gcd(int a, int b) {
        return (b == 0) ? a : gcd(b, a % b);
    }


    static final Random random = new Random();

    static void ruffleSort(int[] a) {
        int n = a.length;//shuffle, then sort
        for (int i = 0; i < n; i++) {
            int oi = random.nextInt(n), temp = a[oi];
            a[oi] = a[i];
            a[i] = temp;
        }
        Arrays.sort(a);
    }

    static void ruffleSort(long[] a) {
        int n = a.length;//shuffle, then sort
        for (int i = 0; i < n; i++) {
            int oi = random.nextInt(n);
            long temp = a[oi];
            a[oi] = a[i];
            a[i] = temp;
        }
        Arrays.sort(a);
    }


    static class FastScanner {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer("");

        String next() {
            while (!st.hasMoreTokens())
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        int[][] readMat(int n, int m) {
            int a[][] = new int[n][m];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    a[i][j] = nextInt();
            return a;
        }

        char[][] readCharMat(int n, int m) {
            char a[][] = new char[n][m];
            for (int i = 0; i < n; i++) {
                String s = next();
                for (int j = 0; j < m; j++)
                    a[i][j] = s.charAt(j);
            }
            return a;
        }


        int[] readArray(int n) {
            int[] a = new int[n];
            for (int i = 0; i < n; i++) a[i] = nextInt();
            return a;
        }

        long[] readLongArray(int n) {
            long[] a = new long[n];
            for (int i = 0; i < n; i++)
                a[i] = nextLong();
            return a;
        }

        long nextLong() {
            return Long.parseLong(next());
        }
    }

    static void print(int a[], int n) {
        for (int i = 0; i < n; i++)
            fop.append((a[i]) + " ");
        // fop.append("\n") ;
    }

    static void print(long a[], int n) {
        for (int i = 0; i < n; i++)
            fop.append((a[i]) + " ");
        // fop.append("\n") ;
    }
}