//由于C++没有直接支持SHA256加密,我们贴心的花了将近100行代码帮你实现了这个功能。你需要补全的代码在第132行qwq

#include <bits/stdc++.h>
using namespace std;
int enc_len;
string enc_key;

constexpr uint32_t SHA256_K[] = {
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};

class SHA256 {
private:
    uint32_t m_h[8];
    std::vector<uint8_t> m_buffer;
    uint64_t m_bit_count;

    static uint32_t rotr(uint32_t x, uint8_t n) { return (x >> n) | (x << (32 - n)); }
    static uint32_t ch(uint32_t e, uint32_t f, uint32_t g) { return (e & f) ^ (~e & g); }
    static uint32_t maj(uint32_t a, uint32_t b, uint32_t c) { return (a & b) ^ (a & c) ^ (b & c); }
    static uint32_t sigma0(uint32_t a) { return rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22); }
    static uint32_t sigma1(uint32_t e) { return rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25); }
    static uint32_t gamma0(uint32_t x) { return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3); }
    static uint32_t gamma1(uint32_t x) { return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10); }

    void transform(const uint8_t* data) {
        uint32_t w[64];
        for (int i = 0; i < 16; ++i) {
            w[i] = static_cast<uint32_t>(data[i * 4 + 0]) << 24 |
                   static_cast<uint32_t>(data[i * 4 + 1]) << 16 |
                   static_cast<uint32_t>(data[i * 4 + 2]) << 8 |
                   static_cast<uint32_t>(data[i * 4 + 3]);
        }
        for (int i = 16; i < 64; ++i) {
            w[i] = gamma1(w[i - 2]) + w[i - 7] + gamma0(w[i - 15]) + w[i - 16];
        }

        uint32_t a = m_h[0], b = m_h[1], c = m_h[2], d = m_h[3],
                 e = m_h[4], f = m_h[5], g = m_h[6], h = m_h[7];

        for (int i = 0; i < 64; ++i) {
            uint32_t t1 = h + sigma1(e) + ch(e, f, g) + SHA256_K[i] + w[i];
            uint32_t t2 = sigma0(a) + maj(a, b, c);
            h = g; g = f; f = e; e = d + t1;
            d = c; c = b; b = a; a = t1 + t2;
        }

        m_h[0] += a; m_h[1] += b; m_h[2] += c; m_h[3] += d;
        m_h[4] += e; m_h[5] += f; m_h[6] += g; m_h[7] += h;
    }

public:
    SHA256() {
        reset();
    }

    void reset() {
        m_h[0] = 0x6a09e667; m_h[1] = 0xbb67ae85; m_h[2] = 0x3c6ef372; m_h[3] = 0xa54ff53a;
        m_h[4] = 0x510e527f; m_h[5] = 0x9b05688c; m_h[6] = 0x1f83d9ab; m_h[7] = 0x5be0cd19;
        m_bit_count = 0;
        m_buffer.clear();
    }

    void update(const uint8_t* data, size_t len) {
        for (size_t i = 0; i < len; ++i) {
            m_buffer.push_back(data[i]);
            if (m_buffer.size() == 64) {
                transform(m_buffer.data());
                m_bit_count += 512;
                m_buffer.clear();
            }
        }
    }

    vector<uint8_t> digest() {
        vector<uint8_t> final_buffer(m_buffer);
        m_bit_count += m_buffer.size() * 8;

        final_buffer.push_back(0x80);
        while (final_buffer.size() % 64 != 56) {
            final_buffer.push_back(0x00);
        }

        for (int i = 7; i >= 0; --i) {
            final_buffer.push_back(static_cast<uint8_t>((m_bit_count >> (8 * i)) & 0xFF));
        }

        for (size_t i = 0; i < final_buffer.size(); i += 64) {
            transform(&final_buffer[i]);
        }

        vector<uint8_t> hash(32);
        for (int i = 0; i < 8; ++i) {
            hash[i * 4 + 0] = static_cast<uint8_t>((m_h[i] >> 24) & 0xFF);
            hash[i * 4 + 1] = static_cast<uint8_t>((m_h[i] >> 16) & 0xFF);
            hash[i * 4 + 2] = static_cast<uint8_t>((m_h[i] >> 8) & 0xFF);
            hash[i * 4 + 3] = static_cast<uint8_t>(m_h[i] & 0xFF);
        }

        reset();
        return hash;
    }
};

string H(string enc) {
    // 1. 拼接 key + enc
    string input = enc_key + enc;

    // 2. 计算 SHA256 哈希
    SHA256 sha;
    sha.update(reinterpret_cast<const uint8_t*>(input.data()), input.size());
    vector<uint8_t> hash_bytes = sha.digest();

    // 3. 转为十六进制字符串
    stringstream ss;
    for (uint8_t byte : hash_bytes) {
        ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte);
    }
    std::string hex_hash = ss.str();

    // 4. 取前 |enc| 个字符
    return hex_hash.substr(0, enc_len);
}

pair<string, string> solve() {
    //此处补全代码
        unordered_map<string,string>seen_hash_M;//hash_string and string
        srand(time(0));
        while(1){
         string randomS;
        const string chars = "abcdefghijklmnopqrstuvwxyz";
          for(int i=0;i<enc_len;i++){
         int randomS_Idx=rand()%chars.size();//随机选字符集的索引(0 ~ chars.length()-1)
           randomS+=chars[randomS_Idx];
           }
          string hash_string=H(randomS);
           if(seen_hash_M.count(hash_string)==1){//发生碰撞 有相同的key值;
          string string_same=seen_hash_M[hash_string];
          if(string_same!=randomS){
            return  pair<string,string>(string_same,randomS);   
           }
           }
           else{
           seen_hash_M[hash_string]=randomS;
           }
        }
}


// pair<string, string> solve() {
//     //此处补全代码
//         unordered_map<string,string>seen_hash_M;//hash_string and string
//      random_device rd;
//     mt19937 gen(rd());
//     uniform_int_distribution<> distrib(0, 25);
//         while(1){
//          string randomS(enc_len, ' ');
//         const string chars = "0123456789abcdefghijklmnopqrstuvwxyz";
//           for(int i=0;i<enc_len;i++){
//              randomS[i] = 'a' + distrib(gen);
//            }
//           string hash_string=H(randomS);
//            if(seen_hash_M.count(hash_string)==1){//发生碰撞 有相同的key值;
//           string string_same=seen_hash_M[hash_string];
//           if(string_same!=randomS){
//             return  pair<string,string>(string_same,randomS);   
//            }
//            }
//            else{
//            seen_hash_M[hash_string]=randomS;
//            }
//         }
// }

















































































































































int main() {
    cin >> enc_len >> enc_key;
    auto result = solve();
    cout << result.first << " " << result.second << endl;
    return 0;
}