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 Main
{

	public static long gcd(long a , long b)
	{
		long divs=0;
		long divd=0;
		if(a>=b)
		{
			divd=a;
			divs=b;
		}
		else
		{
			divd=b;
			divs=a;
		}

		long rem=divd%divs;
		while(rem!=0)
		{
			long temp=divs;
			divs=rem;
			divd=temp;
			rem=divd%divs;
		}
		return divs;

	}
	static class spComp implements Comparator<int[]>
	{
		public int compare(int[] a, int[] b)
		{
			return a[0]-b[0];
		}
	}

	class unionFind
	{

		int parent[];
		int height[];
		int size=0;
		unionFind(int n)
		{
			size=n;
			parent = new int[n];
			height = new int[n];
			// Arrays.fill(parent, -1);
			for(int i=0;i<n;i++)
				parent[i]=i;

		}
		int find(int a)
		{
			if(parent[a]==a)
				return a;

			parent[a]=find(a);

			return parent[a];
		}

		void add(int a, int b)
		{
			a = find(a);
			b = find(b);
			
			if(height[a] > height[b])
			{
				parent[b] = a;
			}
			else if(height[ b ] > height[ a ])
				parent[ a ] = b;
			else if(height[ a ] == height[ b ])
			{
				height[ a ] = height[ a ]+1;
				parent[ b ] = a;
			}


		}
	}

	public static void main(String args[])
	{
		Scanner sc= new Scanner(System.in);
		// long n= sc.nextLong();
		int n= sc.nextInt();
		int arr[]= new int[n];
		int count[]= new int[101];
		for(int i=0;i<n;i++)
		{
			arr[i]= sc.nextInt();
			count[arr[i]]++;
		}
		char[] ch= new char[n];
		int check=0;
		int sum1=0;
		int sum2=0;
		for(int i=0;i<=100;i++)
		{
			if(count[i]==1)
			{
				sum1+=1;
			}
			else if(count[i]>2)
				sum2+=1;	
		}	
		if(sum1%2==1 && sum2==0)
		{
			System.out.println("NO");
			return;
		}

		if(sum1%2==1)
		{
			// System.out.println("NO");
			int togg=0;

			int flag=0;
			for(int i=0;i<n;i++)
			{
				if(count[arr[i]]==1)
				{
					if(flag==0)
					{
						ch[i]='A';
						flag=1;
					}
					else
					{
						ch[i]='B';
						flag=0;
					}

				}
				else if(count[arr[i]]>2 && togg==0)
				{
					if(flag==0)
					{
						ch[i]='A';
						count[arr[i]]=-1;
						flag=1;
					}
					else
					{
						ch[i]='B';
						count[arr[i]]=-2;
						flag=0;
					}
					togg=1;

				}
				else if(count[arr[i]]==-1)
				{
					ch[i]='B';
				}
				else if(count[arr[i]]==-2)
					ch[i]='A';
				else if(count[arr[i]]==2)
					ch[i]='A';
				else ch[i]='A';
			}

		}
		else if(sum1%2==0)
		{
			int flag=0;
			for(int i=0;i<n;i++)
			{
				if(count[arr[i]]==1)
				{
					if(flag==0)
					{
						ch[i]='A';
						flag=1;
					}
					else
					{
						ch[i]='B';
						flag=0;
					}

				}
				else
					ch[i]='A';
			}
		}

		String ans= new String(ch);
		System.out.println("YES");
		System.out.println(ans);



	}



}