#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FOR(i, n, m) for (int i = n; i < (int)m; ++i) #define REP(i, n) FOR (i, 0, n) #define ALL(v) v.begin(), v.end() #define PB push_back using namespace std; using ll = long long; constexpr long long INF = 1000000000; constexpr long long MOD = 998244353; using P = pair; const std::string COLOR_RESET = "\033[0m", BRIGHT_GREEN = "\033[1;32m", BRIGHT_RED = "\033[1;31m", BRIGHT_CYAN = "\033[1;36m", NORMAL_CROSSED = "\033[0;9;37m", RED_BACKGROUND = "\033[1;41m", NORMAL_FAINT = "\033[0;2m"; #ifdef RUN_LOCAL #define dbg(x) \ std::cerr << BRIGHT_CYAN << #x << COLOR_RESET << " = " << (x) \ << NORMAL_FAINT << " (L" << __LINE__ << ") " << __FILE__ \ << COLOR_RESET << std::endl #define dbgif(cond, x) \ ((cond) ? std::cerr << BRIGHT_CYAN << #x << COLOR_RESET << " = " << (x) \ << NORMAL_FAINT << " (L" << __LINE__ << ") " \ << __FILE__ << COLOR_RESET << std::endl \ : std::cerr) #define msg(s) \ std::cerr << BRIGHT_GREEN << s << NORMAL_FAINT << " (L" << __LINE__ \ << ") " << __FILE__ << COLOR_RESET << std::endl #else #define dbg(x) 0 #define dbgif(cond, x) 0 #define msg(s) 0 #endif template inline bool chmax(T &a, T b) { return a < b && (a = b, true); } template inline bool chmin(T &a, T b) { return a > b && (a = b, true); } template std::pair operator+(const std::pair &l, const std::pair &r) { return std::make_pair(l.first + r.first, l.second + r.second); } template std::pair operator-(const std::pair &l, const std::pair &r) { return std::make_pair(l.first - r.first, l.second - r.second); } template std::vector sort_unique(std::vector vec) { sort(vec.begin(), vec.end()), vec.erase(unique(vec.begin(), vec.end()), vec.end()); return vec; } template IStream &operator>>(IStream &is, std::vector &vec) { for (auto &v : vec) is >> v; return is; } template OStream &operator<<(OStream &os, const std::vector &vec); template OStream &operator<<(OStream &os, const std::array &arr); template OStream &operator<<(OStream &os, const std::unordered_set &vec); template OStream &operator<<(OStream &os, const std::pair &pa); template OStream &operator<<(OStream &os, const std::deque &vec); template OStream &operator<<(OStream &os, const std::set &vec); template OStream &operator<<(OStream &os, const std::multiset &vec); template OStream &operator<<(OStream &os, const std::unordered_multiset &vec); template OStream &operator<<(OStream &os, const std::pair &pa); template OStream &operator<<(OStream &os, const std::map &mp); template OStream &operator<<(OStream &os, const std::unordered_map &mp); template OStream &operator<<(OStream &os, const std::tuple &tpl); template OStream &operator<<(OStream &os, const std::vector &vec) { os << '['; for (auto v : vec) os << v << ','; os << ']'; return os; } template OStream &operator<<(OStream &os, const std::array &arr) { os << '['; for (auto v : arr) os << v << ','; os << ']'; return os; } template std::istream &operator>>(std::istream &is, std::tuple &tpl) { std::apply([&is](auto &&...args) { ((is >> args), ...); }, tpl); return is; } template OStream &operator<<(OStream &os, const std::tuple &tpl) { os << '('; std::apply([&os](auto &&...args) { ((os << args << ','), ...); }, tpl); return os << ')'; } template OStream &operator<<(OStream &os, const std::unordered_set &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; } template OStream &operator<<(OStream &os, const std::deque &vec) { os << "deq["; for (auto v : vec) os << v << ','; os << ']'; return os; } template OStream &operator<<(OStream &os, const std::set &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; } template OStream &operator<<(OStream &os, const std::multiset &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; } template OStream &operator<<(OStream &os, const std::unordered_multiset &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; } template OStream &operator<<(OStream &os, const std::pair &pa) { return os << '(' << pa.first << ',' << pa.second << ')'; } template OStream &operator<<(OStream &os, const std::map &mp) { os << '{'; for (auto v : mp) os << v.first << "=>" << v.second << ','; os << '}'; return os; } template OStream &operator<<(OStream &os, const std::unordered_map &mp) { os << '{'; for (auto v : mp) os << v.first << "=>" << v.second << ','; os << '}'; return os; } struct Watch { using Clock = std::chrono::high_resolution_clock; using TimePoint = std::chrono::time_point; TimePoint start_time; std::chrono::duration elapsed; bool running; Watch() : elapsed(0), running(false) {} void start() { if (!running) { start_time = Clock::now(); running = true; } } void stop() { if (running) { elapsed += Clock::now() - start_time; running = false; } } double elapsed_seconds() const { if (running) { return elapsed.count() + std::chrono::duration(Clock::now() - start_time) .count(); } else { return elapsed.count(); } } void reset() { running = false; elapsed = std::chrono::duration::zero(); } }; struct modint { ll n; public: modint(const ll n = 0) : n((n % MOD + MOD) % MOD) {} static modint pow(modint a, int m) { modint r = 1; while (m > 0) { if (m & 1) { r *= a; } a = (a * a); m /= 2; } return r; } modint &operator++() { *this += 1; return *this; } modint &operator--() { *this -= 1; return *this; } modint operator++(int) { modint ret = *this; *this += 1; return ret; } modint operator--(int) { modint ret = *this; *this -= 1; return ret; } modint operator~() const { return (this->pow(n, MOD - 2)); } // inverse friend bool operator==(const modint &lhs, const modint &rhs) { return lhs.n == rhs.n; } friend bool operator<(const modint &lhs, const modint &rhs) { return lhs.n < rhs.n; } friend bool operator>(const modint &lhs, const modint &rhs) { return lhs.n > rhs.n; } friend modint &operator+=(modint &lhs, const modint &rhs) { lhs.n += rhs.n; if (lhs.n >= MOD) lhs.n -= MOD; return lhs; } friend modint &operator-=(modint &lhs, const modint &rhs) { lhs.n -= rhs.n; if (lhs.n < 0) lhs.n += MOD; return lhs; } friend modint &operator*=(modint &lhs, const modint &rhs) { lhs.n = (lhs.n * rhs.n) % MOD; return lhs; } friend modint &operator/=(modint &lhs, const modint &rhs) { lhs.n = (lhs.n * (~rhs).n) % MOD; return lhs; } friend modint operator+(const modint &lhs, const modint &rhs) { return modint(lhs.n + rhs.n); } friend modint operator-(const modint &lhs, const modint &rhs) { return modint(lhs.n - rhs.n); } friend modint operator*(const modint &lhs, const modint &rhs) { return modint(lhs.n * rhs.n); } friend modint operator/(const modint &lhs, const modint &rhs) { return modint(lhs.n * (~rhs).n); } }; istream &operator>>(istream &is, modint m) { is >> m.n; return is; } ostream &operator<<(ostream &os, modint m) { os << m.n; return os; } #define MAX_N 10000000 long long extgcd(long long a, long long b, long long &x, long long &y) { long long d = a; if (b != 0) { d = extgcd(b, a % b, y, x); y -= (a / b) * x; } else { x = 1; y = 0; } return d; } long long mod_inverse(long long a, long long m) { long long x, y; if (extgcd(a, m, x, y) == 1) return (m + x % m) % m; else return -1; } vector fact(MAX_N + 1, INF), fact_inv(MAX_N + 1, INF); modint mod_comb(long long n, long long k) { if (n < 0 || k < 0 || n < k) return 0; if (fact[0] == INF) { fact[0] = 1; for (ll i = 1; i <= MAX_N; ++i) { fact[i] = (fact[i - 1] * i) % MOD; } fact_inv[MAX_N] = mod_inverse(fact[MAX_N], MOD); for (ll i = MAX_N - 1; i >= 0; i--) { fact_inv[i] = (fact_inv[i + 1] * (i + 1)) % MOD; } } return (((fact[n] * fact_inv[k]) % MOD) * fact_inv[n - k]) % MOD; } using mi = modint; mi mod_pow(mi a, ll n) { mi ret = 1; mi tmp = a; while (n > 0) { if (n % 2) ret *= tmp; tmp = tmp * tmp; n /= 2; } return ret; } struct UnionFind { vector data; vector a; vector b; UnionFind() = default; explicit UnionFind(size_t sz) : data(sz, -1), a(sz, 0), b(sz, 0) {} int unite(int x, int y) { x = find(x), y = find(y); if (x == y) return false; if (data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; a[x] += a[y]; b[x] += b[y]; int ret = min(a[x], b[x]); a[x] -= ret; b[x] -= ret; return ret; } int find(int k) { if (data[k] < 0) return (k); return data[k] = find(data[k]); } int size(int k) { return -data[find(k)]; } bool same(int x, int y) { return find(x) == find(y); } vector> groups() { int n = (int)data.size(); vector> ret(n); for (int i = 0; i < n; ++i) { ret[find(i)].emplace_back(i); } ret.erase(remove_if(begin(ret), end(ret), [&](const vector &v) { return v.empty(); }), end(ret)); return ret; } }; uint64_t xorshift(ll n = 0) { static uint64_t state[2] = {123456789ULL, 987654321ULL}; uint64_t s1 = state[0]; uint64_t s0 = state[1]; state[0] = s0; s1 ^= s1 << 23; state[1] = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26); return (n != 0) ? ((state[1] + s0) % n) : (state[1] + s0); } template struct BinaryIndexedTree { private: int n; vector data; public: BinaryIndexedTree() = default; explicit BinaryIndexedTree(int n) : n(n) { data.assign(n + 1, T()); } explicit BinaryIndexedTree(const vector &v) : BinaryIndexedTree((int)v.size()) { build(v); } void build(const vector &v) { assert(n == (int)v.size()); for (int i = 1; i <= n; i++) data[i] = v[i - 1]; for (int i = 1; i <= n; i++) { int j = i + (i & -i); if (j <= n) data[j] += data[i]; } } void apply(int k, const T &x) { for (++k; k <= n; k += k & -k) data[k] += x; } T prod(int r) const { T ret = T(); for (; r > 0; r -= r & -r) ret += data[r]; return ret; } T prod(int l, int r) const { return prod(r) - prod(l); } int lower_bound(T x) const { int i = 0; for (int k = 1 << (__lg(n) + 1); k > 0; k >>= 1) { if (i + k <= n && data[i + k] < x) { x -= data[i + k]; i += k; } } return i; } int upper_bound(T x) const { int i = 0; for (int k = 1 << (__lg(n) + 1); k > 0; k >>= 1) { if (i + k <= n && data[i + k] <= x) { x -= data[i + k]; i += k; } } return i; } }; void solve() { int n; cin >> n; vector d(n); REP (i, n) cin >> d[i]; sort(ALL(d)); string ans = ""; REP (i, n) ans += 'A' + (d[i] % 26); cout << ans << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }