<p>A <strong>distinct string</strong> is a string that is present only <strong>once</strong> in an array.</p>

<p>Given an array of strings <code>arr</code>, and an integer <code>k</code>, return <em>the </em><code>k<sup>th</sup></code><em> <strong>distinct string</strong> present in </em><code>arr</code>. If there are <strong>fewer</strong> than <code>k</code> distinct strings, return <em>an <strong>empty string </strong></em><code>&quot;&quot;</code>.</p>

<p>Note that the strings are considered in the <strong>order in which they appear</strong> in the array.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> arr = [&quot;d&quot;,&quot;b&quot;,&quot;c&quot;,&quot;b&quot;,&quot;c&quot;,&quot;a&quot;], k = 2
<strong>Output:</strong> &quot;a&quot;
<strong>Explanation:</strong>
The only distinct strings in arr are &quot;d&quot; and &quot;a&quot;.
&quot;d&quot; appears 1<sup>st</sup>, so it is the 1<sup>st</sup> distinct string.
&quot;a&quot; appears 2<sup>nd</sup>, so it is the 2<sup>nd</sup> distinct string.
Since k == 2, &quot;a&quot; is returned. 
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> arr = [&quot;aaa&quot;,&quot;aa&quot;,&quot;a&quot;], k = 1
<strong>Output:</strong> &quot;aaa&quot;
<strong>Explanation:</strong>
All strings in arr are distinct, so the 1<sup>st</sup> string &quot;aaa&quot; is returned.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> arr = [&quot;a&quot;,&quot;b&quot;,&quot;a&quot;], k = 3
<strong>Output:</strong> &quot;&quot;
<strong>Explanation:</strong>
The only distinct string is &quot;b&quot;. Since there are fewer than 3 distinct strings, we return an empty string &quot;&quot;.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= k &lt;= arr.length &lt;= 1000</code></li>
	<li><code>1 &lt;= arr[i].length &lt;= 5</code></li>
	<li><code>arr[i]</code> consists of lowercase English letters.</li>
</ul>

class Solution {
public:
    static inline uint64_t c2i(const string::value_type c, unsigned shift) {
        return ((uint64_t)c) << shift;
    }
    static inline uint64_t s2i(const string& s) {
        switch (s.size()) {
        case 0:
            assert(0);
            return 0;
        case 1:
            return c2i(s[0], 0);
        case 2:
            return c2i(s[0], 0) + c2i(s[1], 8);
        case 3:
            return c2i(s[0], 0) + c2i(s[1], 8) + c2i(s[2], 16);
        case 4:
            return c2i(s[0], 0) + c2i(s[1], 8) + c2i(s[2], 16) + c2i(s[3], 24);
        case 5:
            return c2i(s[0], 0) + c2i(s[1], 8) + c2i(s[2], 16) + c2i(s[3], 24) +
                   c2i(s[4], 32);
        }
        assert(0);
        return 0;
    }
    string kthDistinct(vector<string>& arr, int k) {
        const int size = arr.size();
        using Pair = pair<uint64_t, uint64_t>;
        vector<Pair> seen;
        seen.reserve(size);

        for (int i = 0; i < size; ++i) {
            const uint64_t key = s2i(arr[i]);
            const auto it = lower_bound(seen.begin(), seen.end(), Pair{key, 0});
            if (it == seen.end()) {
                seen.push_back({key, 1});
            } else if (it->first == key) {
                ++it->second;
            } else {
                const size_t rightcount = seen.end() - it;
                seen.resize(seen.size() + 1);
                memmove(&*next(it), &*it, sizeof(*it) * rightcount);
                *it = {key, 1};
            }
        }
        for (int i = 0; i < size; ++i) {
            const auto& s = arr[i];
            if (lower_bound(seen.begin(), seen.end(), Pair{s2i(s), 0})
                        ->second == 1 and
                --k == 0)
                return s;
        }
        return string();
    }
};
16500