fun quicksort [] = [] | quicksort (h::tl) = let val (s, b) = List.foldl (fn (x, (small, big)) => if x <= h then (x::small, big) else (small, x::big)) ([], []) tl in (quicksort s) @ [h] @ (quicksort b) end fun readStr () = let fun scan reader stream = SOME (StringCvt.splitl (not o Char.isSpace) reader (StringCvt.skipWS reader stream)) in valOf (TextIO.scanStream scan TextIO.stdIn) end fun replaceFromLast toRemove toAdd l = let fun replace [] = [] | replace (h::tl) = if h = toRemove then toAdd :: tl else replace tl in List.rev (replace (List.rev l)) end fun findAns s = let val asInt = List.map (fn ch => Char.ord ch) (String.explode s) val sorted = List.rev (quicksort asInt) fun findAnsAux [] _ = [] | findAnsAux _ [] = [] | findAnsAux (oh::ot) (dh::dt) = if oh <> dh then dh :: replaceFromLast dh oh ot else oh :: findAnsAux ot dt in String.implode (List.map (fn i => Char.chr i) (findAnsAux asInt sorted)) end val () = let val n = readStr () val ans = findAns n in print (ans ^ "\n") end