import java.util.*;


public class Solution {
    /**
     * return topK string
     * @param strings string字符串一维数组 strings
     * @param k int整型 the k
     * @return string字符串二维数组
     */
    // 1.使用map存放字符串出现的次数
    // 2.使用优先级队列存放出现次数最多的k个字符串  
    //    2.1 常规的就是小顶堆,队列头部是最小的 offer和poll都是顶部元素
    public String[][] topKstrings (String[] strings, int k) {
        // write code here
        HashMap<String,Integer> map = new HashMap<>();
        for (String str : strings) {
            map.put(str, map.getOrDefault(str, 0) + 1);
        }

        PriorityQueue<String> queue = new PriorityQueue<>(new Comparator<String>(){
            @Override
            public int compare(String o1,String o2){
                if (map.get(o1).equals(map.get(o2))){
                    return o2.compareTo(o1);
                }else {
                    return map.get(o1) - map.get(o2);
                }
            }
        });


        for (Map.Entry<String,Integer> entry : map.entrySet()) {
            // 
            queue.offer(entry.getKey());

            if (queue.size() > k){
                queue.poll();
            }
        }
        String[][] res = new String[k][2];
        for (int i = 0; i < k; i++) {
            String cur = queue.poll();
            res[k-1-i] = new String[]{ cur,String.valueOf(map.get(cur)) } ;
        }
        return res;

    }
}