# 영단어 암기는 괴로워 import sys import heapq input = sys.stdin.readline def set_priority(words, word): word_info = words.get(word, None) frequency, length = 0, 0 if word_info: frequency = -(word_info[0]) + 1 length = -(word_info[1]) else: frequency = 1 length = len(word) words[word] = [-frequency, -length, word, 0] return words[word] def solution(): n, m = map(int, input().rstrip().split()) words = {} word_list = [] for i in range(n): word = input().rstrip() if len(word) < m: continue heapq.heappush(word_list, set_priority(words, word)) for i in range(len(word_list)): f, l, w, is_pop = heapq.heappop(word_list) if words.get(w)[3]: continue else: print(w) words[w][3] = 1 return solution() """ 걸린 시간: 35분 시간 복잡도: set_priority는 단어 길이를 세고, 정보를 dict에서 읽고 쓰는 것인데 m은 최대 10이므로 전체 시간복잡도는 O(1)이다. solution 함수에서 n개의 단어를 보며 set_priority를 실행하고, heap에 push하므로 요소당 O(logn)이기 때문에 O(nlogn)이다. 마지막으로 word_list를 확인할 때도 heap에서 pop이므로 O(nlogn)이다. 따라서 전체 시간복잡도는 O(nlogn)이다. 해설: heap에서 정렬할 때 우선순위 3가지로 정렬하도록 리스트를 넣는다. 그러기 위해 word_info dict을 만들어서 정보 업데이트를 O(1)에 한다. 단어마다 정보를 업데이트 해가며 heap에 넣고, 다 넣은 다음 heappop 하면서 기존에 안 나온 것들만 출력을 한다. 좀 빠르게 해보겠다고 heap 써서 O(nlogn)으로 했지만 그냥 Counter 하고, 우선순위 역순으로 sort 3번 하면 이것도 O(nlogn)이다... """