class Solution {
public:
    struct cmp{
        bool operator() (pair<string, int> &p1, pair<string, int> &p2) {
            return p1.second > p2.second || (p1.second == p2.second && p1.first < p2.first);
        }
    };
    vector<vector<string> > topKstrings(vector<string>& strings, int k) {
        unordered_map<string, int> mp; // 哈希表
        for(const string &str: strings){
            ++mp[str];
        }
        priority_queue<pair<string, int>, vector<pair<string, int >>, cmp> pq; // 重新构造排序
        for(const auto& [str,cnt]: mp){
            if(pq.size() < k) pq.emplace(make_pair(str, cnt)); // make_pair()生成pair 对象
            else if (cnt > pq.top().second || cnt == pq.top().second && str < pq.top().first){
                pq.pop(); pq.emplace(make_pair(str, cnt));  
            }
        }
        vector<vector<string>> ans(k);
        while(!pq.empty()){
            ans[--k] = move(vector<string>{pq.top().first, to_string(pq.top().second)}); // move 右值引用
            pq.pop();
        }
        return ans;
    }

};