#!/usr/bin/python3 # KSP 32-Z3-1 Tiskařský stroj # Autor: Jirka Sejkora import itertools # Formát vstupu: # na prvním řádku počet dvojic, co budeme vypisovat # na druhém řádku slova, ve kterých budeme hledat dvojice # Formát výstupu: # řádky s jednotlivými dvojicemi pair_count = int(input()) words = input().split(' ') # Uložíme si počty výskytu jednotlivých dvojic do slovníku counts = {} for word in words: for i in range(1, len(word)): # Dvojice reprezentujeme jako textové řetězce délky 2. # Místo toho bychom z nich mohli také vyrobit tuple (písmeno, písmeno), # takhle si ušetříme slepování na konci. pair = word[i-1] + word[i] # Využíváme parametru pro defaultní hodnotu pokud dvojice ještě ve # slovníku není. Taktéž bychom pro to mohli použít datovou strukturu # collections.defaultdict, kde se definuje defaultní hodnota už při # vytvoření. count = counts.get(pair, 0) counts[pair] = count + 1 # Prvky slovníku - dvojice písmen a jejich počet - sestupně setřídíme podle # uloženého počtu, což specifikujeme v lambda funkci key, jejíž výsledek určuje # podle čeho se třídí. ordered = sorted(counts.items(), key=lambda x: x[1], reverse=True) # Ze setřízených prvků slovníku vybereme pouze dvojice písmen. # Záměrně konstruujeme generátor pomocí kulatých závorek - díky tomu # nevytvoříme celý seznam v paměti, když to není potřeba. ordered_pairs = (kv[0] for kv in ordered) # Vybereme z našeho generátoru prvních pair_count dvojic, využíváme pro to # itertools.islice, čím získáme znovu generátor, který rovnou předáme do # slepovací funkce join. print("\n".join(itertools.islice(ordered_pairs, pair_count)))