题目来源:

https://vjudge.net/contest/291737#problem/G

https://codeforces.com/problemset/problem/1051/C

万圣节到了,杰哥准备给班级里的同学发糖吃,男生女生各一堆。于是他去腐败街的xx小卖部买糖,他认为糖只要是独一无二的那他就是好糖,他跟老板说他想要买n个不一样的糖,但是老板是个黑心商贩,当杰哥把糖带回去的时候才发现有挺多相同的糖
而杰哥是一个公平正直的人,他希望男生女生两堆糖中好糖的数量相同,于是他想找你帮忙来解决他的烦恼。
为了简化问题我们将不同的糖用不用的数字表示。

Input

第一行输入一个整数 n(2<=n<=100)
第二行输入n个整数 s1,s2,...sn(1<=si<=100)表示第i个糖是哪种糖

Output

如果杰哥无法将这些糖合理的分成2份则输出一行"NO"
如果可以 则输出一行"YES"下一行输出n个字符,第i个字符表示第i个糖属于男生还是女生(女生输出A,男生输出B)
情况有多种,任选一种情况输出即可。

Examples

Input

4
3 5 7 1

Output

YES
BABA

Input

3
3 5 1

Output

NO

题意:定义在某一组只出现一次的糖果把他叫做“好糖”,给定一组糖果,我们把他们分为A,B两组,保证两组的好糖的数量相同。直接模拟,由于理解错了题意,以为好糖是定义在全部糖果里面的,赛后听胡大佬说在某一堆是唯一的也算,才恍然大悟。

思路:我们先用桶装一下不同种类的糖果,先考虑出现一次的数字,如果个数为一的糖果是偶数个则能分,如果是奇数个则不能分。然后再考虑个数数>=3的糖果,把他们一次交替放在一个数组中(^放01然后输出10随便对应AB都行)。

参考代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define ll long long int
#define N 10005
#define inf 0x3f3f3f3f
using namespace std;
int a[N];
bool ans[N];
map<int, int> sum;
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i = 1; i <= n; i++)//"桶装“
        {
            cin>>a[i];
            sum[a[i]]++;
        }
        int sum1 = 0,sum3 = 0;
        for(int i = 1; i <= 100; i++)
        {
            if(sum[i] == 1)
                sum1++;
            else if(sum[i] >= 3)
                sum3++;
        }
        for(int i = 1; i <= n; i++)
        {
            if(sum[a[i]] == 2)//数量正好为二
                ans[i] = 1;
        }
        if(sum1 % 2 == 0)//如果出现过一次的个数是偶数个那么可以直接分两堆
        {
            cout<<"YES\n";
            bool flag = 0;
            for(int i = 1; i <= n; i++)
            {
                if(sum[a[i]] == 1)
                {
                    ans[i] = 1^flag;
                    flag ^= 1;
                }
                else
                    ans[i] = 1;
            }
            for(int i = 1; i <= n; i++)
                cout<<(ans[i]?'A':'B');
            cout<<endl;
            continue;
        }
        if(sum3 == 0)//如果单个糖果的种类为奇数并且没有3种的那么就不能使得两边“好糖”数目相同
        {
            cout<<"NO\n";
            continue;
        }
        cout<<"YES\n";
        bool flag = 0;
        for(int i = 1; i <= n; i++)
        {
            if(sum[a[i]] >= 3)
            {
                ans[i] =0^flag;
                flag = 1;
            }
        }
        flag = 0;
        for(int i = 1; i <= n; i++)
        {
            if(sum[a[i]] == 1)
            {
                ans[i] = 1^ flag;
                flag ^= 1;
            }
        }
        for(int i = 1; i <= n; i++)
            cout<<(ans[i]?'A':'B');
        cout<<endl;
    }
    return 0;
}