読者です 読者をやめる 読者になる 読者になる

300億円欲しい

メジャーリーグのデータ解析します

ARC003 問題B 逆さま辞書

Haskell ARC

やっぱHaskellって凄いわ!という話です。

問題

高橋君は友達とチャットで逆さしりとりをすることにしました。
逆さしりとりとは、前の人が言った単語の頭文字で終わる単語を答えるしりとりです。
しかし、高橋君は英単語に自信がないのでこっそり「さかさま辞書」を使うことにしました。

普通の辞書は単語の先頭の文字がABC順になるように並べられており、同じ文字同士の場合はその次の文字がABC順になるように並べられます。
先頭から見ていく普通の辞書順に対して、「さかさま辞書」は後ろの文字から見ていきます。
例えば apple, bee, card は、普通の辞書なら apple → bee → card の順になります。
しかし、「さかさま辞書」では d で終わる card が 1 番、apple とbee は同じ e で終わるのでその 1 つ前が e である bee が 2 番、l であるapple が 3 番の順になります。

入力

入力は以下の形式で標準入力から与えられる。

N
s1
s2
:
:
sN

1 行目は、並べる単語数を表す整数 N(1≦N≦100) が与えられる。
2 行目から N 行は、並べる単語を表す文字列が 1 行に 1 つずつ与えられる。
i+1 行目の文字列 si の長さは 1 文字以上 20 文字以下で、含まれる文字はアルファベットの小文字のみ(a-z)です。
なお、重複する単語が与えられることはありません。

出力

入力として与えられた単語を、さかさま辞書順に標準出力に 1 行ずつ出力せよ。
なお、最後には改行を出力せよ。

http://arc003.contest.atcoder.jp/tasks/arc003_2

解答

めんどくさそう。
しかしhaskellだと簡単に書けそうです。

import Data.List
main = do
    getLine
    interact $ unlines . map reverse . sort . map reverse . lines 

1行目は捨てて、残りの単語はlinesしてリストに入れます。
反転してソートして反転すれば整列完了。
unlinesで改行を入れて答え。
これは楽。haskellは光。

C++のコードは後で。