日刊競プロ ABC 219 -C - Neo-lexicographic Ordering-
C - Neo-lexicographic Ordering
問題文
AtCoder 王国を治める高橋君は、英小文字のアルファベット順を変更することにしました。
新たなアルファベット順はa , b ,…, z を並べ替えて得られる文字列 X を用いて表されます。X の i(1≤i≤26) 文字目は、新たな順番において i 番目に小さい英小文字を表します。
AtCoder 王国には N 人の国民がおり、それぞれの国民の名前は S1,S2,…,SNです。ここで、Si(1≤i≤N) は英小文字からなります。
これらの名前を、高橋君の定めたアルファベット順に基づく辞書順に従って並べ替えてください。
制約
X は a , b ,…, z を並べ替えて得られる
2≤N≤50000
N は整数
1≤∣Si∣≤10(1≤i≤N)
Siは英小文字からなる (1≤i≤N)
Si≠Sj(1≤i<j≤N)
考えたこと
abcの順番が入れ替わっているので,元々のabcの順番との対応関係を辞書で作成しておき,元々でいうと何の文字列なのか?という対応関係の辞書も作り,辞書順でソートしてあげて出力すれば良いと考えた.2つの辞書を作成することで実現できると考えた.
コード
#オリジナルの辞書
ori ='abcdefghijklmnopqrstuvwxyz'
X = input()
N = int(input())
d ={}
#対応関係を辞書にする
for i in range(len(X)):
d[X[i]]=ori[i]
ans = {}
for _ in range(N):
temp = input()
tmp = ''
#対応関係から文字列の辞書を作る
for i in range(len(temp)):
tmp+=str(d[temp[i]])
ans[temp]=tmp
#辞書のitemでソートする
score_sorted = sorted(ans.items(), key=lambda x:x[1])
#辞書のキーを順番に出力
for i in range(len(ans)):
print (score_sorted[i][0])
解説を見た考察
二つの文字列が与えられたときに大小関係がわかる関数を作成し用いるのがメインっぽい.比較する文字列が同じだった場合は文字数が少ない方が先にするという処理も必要