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.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class C {
  public static void main(String[] args) {
    InputStream input;
    OutputStream output;

    try {
      input = new FileInputStream("input.txt");
      output = new FileOutputStream("output.txt");
    } catch (FileNotFoundException e) {
      input = System.in;
      output = System.out;
    }
    Kattio io = new Kattio(input, output);
    (new Solve(io)).main();

    io.close();
    if (input instanceof FileInputStream)
      try {
        input.close();
      } catch (IOException e) {
      }
    if (output instanceof FileOutputStream)
      try {
        output.close();
      } catch (IOException e) {
      }
  }
}
class Solve
{
  static final int maxs = 100;
  int n;
  int[] a;
  int[] s;
  Kattio io;
  Set<Integer> Sa,Sb;
  Solve(Kattio io)
  {
    this.io = io;
  }
  void main()
  { 
    n = io.getInt();
    s = new int[n+1];
    a = new int[maxs+1];
    Arrays.fill(a, 0);
    for (int i=1; i<=n; i++)
    {
      s[i] = io.getInt();
      a[s[i]]++;
    }
    
    Sa = new TreeSet<>();
    Sb = new TreeSet<>();
    for (int i=1; i<=maxs; i++)
    {
      if (a[i]==1)
      {
        if (Sa.size()<=Sb.size())
          Sa.add(i);
        else
          Sb.add(i);
      }
    }
    
    for (int i=1; i<=maxs; i++)
    {
      if (a[i]>2)
      {
        if (Sb.size()<Sa.size())
          Sb.add(i);
      }
    }
    
    if (Sa.size()!=Sb.size())
    {
      io.println("NO");
      return;
    }
    
    io.println("YES");
    
    for (int i=1; i<=n; i++)
    {
      if (Sa.contains(s[i]))
      {
        io.print('A');
        Sa.remove(s[i]);
      }
      else
      if (Sb.contains(s[i]))
      {
        io.print('B');
        Sb.remove(s[i]);
      }
      else
       io.print('A'); 
    }
  }
}

class Kattio extends PrintWriter {
  public Kattio(InputStream i) {
    super(new BufferedOutputStream(System.out));
    r = new BufferedReader(new InputStreamReader(i));
  }

  public Kattio(InputStream i, OutputStream o) {
    super(new BufferedOutputStream(o));
    r = new BufferedReader(new InputStreamReader(i));
  }

  public boolean hasMoreTokens() {
    return peekToken() != null;
  }

  public int getInt() {
    return Integer.parseInt(nextToken());
  }

  public double getDouble() {
    return Double.parseDouble(nextToken());
  }

  public long getLong() {
    return Long.parseLong(nextToken());
  }

  public String getWord() {
    return nextToken();
  }



  private BufferedReader r;
  private String line;
  private StringTokenizer st;
  private String token;

  private String peekToken() {
    if (token == null)
      try {
        while (st == null || !st.hasMoreTokens()) {
          line = r.readLine();
          if (line == null)
            return null;
          st = new StringTokenizer(line);
        }
        token = st.nextToken();
      } catch (IOException e) {
      }
    return token;
  }

  private String nextToken() {
    String ans = peekToken();
    token = null;
    return ans;
  }
}