Problem:
Score: 300 points

Problem Statement

We have N voting papers. The i-th vote (1 \leq i \leq N) has the string S_i written on it.

Print all strings that are written on the most number of votes, in lexicographical order.

Constraints

1 \leq N \leq 2 \times 10^5

S_i (1 \leq i \leq N) are strings consisting of lowercase English letters.

The length of S_i (1 \leq i \leq N) is between 1 and 10 (inclusive).

Input

Input is given from Standard Input in the following format:

N
S_1
:
S_N

Output

Print all strings in question in lexicographical order.

Sample Input 1

7
beat
vet
beet
bed
vet
bet
beet

Sample Output 1

beet
vet

beet and vet are written on two sheets each, while beat, bed, and bet are written on one vote each. Thus, we should print the strings beet and vet.

Sample Input 2

8
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo

Sample Output 2

buffalo

Sample Input 3

7
bass
bass
kick
kick
bass
kick
kick

Sample Output 3

kick

Sample Input 4

4
ushi
tapu
nichia
kun

Sample Output 4

kun
nichia
tapu
ushi

Solution in Common Lisp (SBCL 2.0.3) (judge verdict: Accepted)

(eval-when (:compile-toplevel :load-toplevel :execute)
  (sb-int:defconstant-eqx OPT
    #+swank '(optimize (speed 3) (safety 2))
    #-swank '(optimize (speed 3) (safety 0) (debug 0))
    #'equal)
  #+swank (ql:quickload '(:cl-debug-print :fiveam) :silent t)
  #-swank (set-dispatch-macro-character
           ;; enclose the form with VALUES to avoid being captured by LOOP macro
           #\# #\> (lambda (s c p) (declare (ignore c p)) `(values ,(read s nil nil t)))))
#+swank (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)
#-swank (disable-debugger) ; for CS Academy

;; BEGIN_INSERTED_CONTENTS
(declaim (inline read-schar))
(defun read-schar (&optional (stream *standard-input*))
  (declare #-swank (sb-kernel:ansi-stream stream)
           (inline read-byte))
  #+swank (read-char stream nil #\Newline) ; on SLIME
  #-swank (code-char (read-byte stream nil #.(char-code #\Newline))))

(macrolet ((def (name fname)
             `(define-modify-macro ,name (new-value) ,fname)))
  (def minf min)
  (def maxf max)
  (def mulf *)
  (def divf /)
  (def iorf logior)
  (def xorf logxor)
  (def andf logand))

(defmacro dbg (&rest forms)
  #+swank
  (if (= (length forms) 1)
      `(format *error-output* "~A => ~A~%" ',(car forms) ,(car forms))
      `(format *error-output* "~A => ~A~%" ',forms `(,,@forms)))
  #-swank (declare (ignore forms)))
 
(defmacro define-int-types (&rest bits)
  `(progn
     ,@(mapcar (lambda (b) `(deftype ,(intern (format nil "UINT~A" b)) () '(unsigned-byte ,b))) bits)
     ,@(mapcar (lambda (b) `(deftype ,(intern (format nil "INT~A" b)) () '(signed-byte ,b))) bits)))
(define-int-types 2 4 7 8 15 16 31 32 62 63 64)
 
(declaim (inline println))
(defun println (obj &optional (stream *standard-output*))
  (let ((*read-default-float-format* 'double-float))
    (prog1 (princ obj stream) (terpri stream))))
 
(defconstant +mod+ 1000000007)
 
;;;
;;; Body
;;;

(declaim (inline string16=))
(defun string16= (s1 s2)
  (declare #.OPT
           ((simple-base-string 16) s1 s2))
  (and (= (sb-kernel:%vector-raw-bits s1 0) (sb-kernel:%vector-raw-bits s2 0))
       (= (sb-kernel:%vector-raw-bits s1 1) (sb-kernel:%vector-raw-bits s2 1))))
 
(declaim (inline write-line*))
(defun write-line* (s)
  (declare ((simple-base-string 16) s))
  (loop for i from 7 downto 0
        when (char= (aref s i) #\Nul)
        do (return)
        do (write-char (aref s i))
        finally (loop for i from 15 downto 8
                      until (char= (aref s i) #\Nul)
                      do (write-char (aref s i))))
  (terpri))

(declaim (inline string16<))
(defun string16< (s1 s2)
  (declare (simple-base-string s1 s2))
  (or (< (sb-kernel:%vector-raw-bits s1 0) (sb-kernel:%vector-raw-bits s2 0))
      (and (= (sb-kernel:%vector-raw-bits s1 0) (sb-kernel:%vector-raw-bits s2 0))
           (< (sb-kernel:%vector-raw-bits s1 1) (sb-kernel:%vector-raw-bits s2 1)))))

(declaim (inline %median3))
(defun %median3 (x y z)
  (if (string16< x y)
      (if (string16< y z)
          y
          (if (string16< z x)
              x
              z))
      (if (string16< z y)
          y
          (if (string16< x z)
              x
              z))))

(defun quicksort! (vector)
  (declare #.OPT
           ((simple-array t (*)) vector))
  (labels
      ((recur (left right)
         (when (< left right)
           (let* ((l left)
                  (r right)
                  (pivot (%median3 (aref vector l)
                                   (aref vector (ash (+ l r) -1))
                                   (aref vector r))))
             (declare ((integer 0 #.most-positive-fixnum) l r))
             (loop (loop while (string16< (aref vector l) pivot)
                         do (incf l))
                   (loop while (string16< pivot (aref vector r))
                         do (decf r))
                   (when (>= l r)
                     (return))
                   (rotatef (aref vector l) (aref vector r))
                   (incf l 1)
                   (decf r 1))
             (recur left (- l 1))
             (recur (+ r 1) right)))))
    (recur 0 (- (length vector) 1))
    vector))

(defun main ()
  (declare #.OPT)
  (let* ((n (read))
         (ss (make-array n :element-type 'simple-base-string))
         (dp (make-array n :element-type 'uint31 :initial-element 1))
         (max 1))
    (declare (uint62 n max))
    (dotimes (i n)
      (let ((s (make-string 16 :element-type 'base-char :initial-element #\Nul)))
        (loop for j from 7 downto 0
              for c = (read-schar)
              when (char= c #\Newline)
              do (return)
              do (setf (aref s j) c)
              finally (loop for j from 15 downto 8
                            for c = (read-schar)
                            until (char= c #\Newline)
                            do (setf (aref s j) c)))
        (setf (aref ss i) s)))
    (quicksort! ss)
    (setf (aref dp 0) 1)
    (dotimes (i (- n 1))
      (when (string16= (aref ss i) (aref ss (+ i 1)))
        (setf (aref dp (+ i 1)) (+ 1 (aref dp i))))
      (maxf max (aref dp (+ i 1))))
    (write-string
     (with-output-to-string (*standard-output* nil :element-type 'base-char)
       (dotimes (i n)
         (when (= max (aref dp i))
           (write-line* (aref ss i))))))))
 
#-swank (main)

;;;
;;; Test and benchmark
;;;

#+swank
(defun io-equal (in-string out-string &key (function #'main) (test #'equal))
  "Passes IN-STRING to *STANDARD-INPUT*, executes FUNCTION, and returns true if
the string output to *STANDARD-OUTPUT* is equal to OUT-STRING."
  (labels ((ensure-last-lf (s)
             (if (eql (uiop:last-char s) #\Linefeed)
                 s
                 (uiop:strcat s uiop:+lf+))))
    (funcall test
             (ensure-last-lf out-string)
             (with-output-to-string (out)
               (let ((*standard-output* out))
                 (with-input-from-string (*standard-input* (ensure-last-lf in-string))
                   (funcall function)))))))

#+swank
(defun get-clipbrd ()
  (with-output-to-string (out)
    #+os-windows (run-program "powershell.exe" '("-Command" "Get-Clipboard") :output out :search t)
    #+os-unix (run-program "xsel" '("-b" "-o") :output out :search t)))

#+swank (defparameter *this-pathname* (uiop:current-lisp-file-pathname))
#+swank (defparameter *dat-pathname* (uiop:merge-pathnames* "test.dat" *this-pathname*))

#+swank
(defun run (&optional thing (out *standard-output*))
  "THING := null | string | symbol | pathname

null: run #'MAIN using the text on clipboard as input.
string: run #'MAIN using the string as input.
symbol: alias of FIVEAM:RUN!.
pathname: run #'MAIN using the text file as input."
  (let ((*standard-output* out))
    (etypecase thing
      (null
       (with-input-from-string (*standard-input* (delete #\Return (get-clipbrd)))
         (main)))
      (string
       (with-input-from-string (*standard-input* (delete #\Return thing))
         (main)))
      (symbol (5am:run! thing))
      (pathname
       (with-open-file (*standard-input* thing)
         (main))))))

#+swank
(defun gen-dat ()
  (uiop:with-output-file (out *dat-pathname* :if-exists :supersede)
    (format out "200000~%")
    (dotimes (_ 200000)
      (let ((s (make-string 10)))
        (dotimes (i 10)
          (setf (aref s i) (code-char (+ 97 (random 26)))))
        (write-line s out)))))

#+swank
(defun bench (&optional (out (make-broadcast-stream)))
  (time (run *dat-pathname* out)))

;; To run: (5am:run! :sample)
#+swank
(it.bese.fiveam:test :sample
  (it.bese.fiveam:is
   (common-lisp-user::io-equal "7
beat
vet
beet
bed
vet
bet
beet
"
    "beet
vet
"))
  (it.bese.fiveam:is
   (common-lisp-user::io-equal "8
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
"
    "buffalo
"))
  (it.bese.fiveam:is
   (common-lisp-user::io-equal "7
bass
bass
kick
kick
bass
kick
kick
"
    "kick
"))
  (it.bese.fiveam:is
   (common-lisp-user::io-equal "4
ushi
tapu
nichia
kun
"
    "kun
nichia
tapu
ushi
")))