AtCoder Beginner Contest 268 G問題 Random Student ID
問題
提出解答
問題の概要
を英小文字全体からなる集合とする. つまり, である. また, を の全順序全体の集合とする.
個の相異なる英小文字列 がある. からランダムに全順序 からを1つ選び, に従う辞書式にこの 個の文字列を並び替えることを行う.
このとき, それぞれについて, の順位の期待値を求めよ.
制約
- は英小文字からなる非空の文字列
- は互いに異なる.
解法
非空文字列 と全順序 に対して, を に従う辞書式順序において, が 以上ならば , が 未満ならば であるとする.
このとき, 全順序 を一つ固定したとき, 個の文字列 の順位 は
であるから, 期待値 は
ここで, 非空英文字列 に対して, を
と定めると,
である.
このとき, は次の数を表している.
- の全順序のうち, それに従う辞書式順序において, が 以上になる全順序の数.
を求めることにする.
- で となる整数 が存在する場合,
とすると, の順序は の順序に一致する. よって, は が よりも大きくなる全順序の数なので,
である.
- 任意の で である場合.
- ならば, は の (真の) prefix であるから, 任意の全順序で は より小さくなる. よって, である.
- ならば, であるから, 任意の全順序で は 以上 (正確にはイコール) である. よって, である.
- ならば, は の (真の) prefix であるから, 任意の全順序で は より大きくなる. よって, である.
が の真の prefix であり, その時に限り と書くことにすると,
である.
ここで, をそれぞれ
とする. つまり, は にある を真の prefix にする文字列の数, は にある の真の prefix の数である..
すると, は互いに異なることから,
となる.
よって, を求められれば十分であることが分かった. つまり, 次の問題に帰着される.
個の文字列 が与えられる. このとき, に対して以下をそれぞれ求めよ.
- にある文字列のうち, を真の prefix にする文字列の数 ()
- にある文字列のうち, が真の prefix になる文字列の数 ()
これらは を Trie Tree で記録すると, はそれぞれ次のようになる.
- : の末尾が担う頂点を根とする部分木における (自分自身を除く) ターミナル頂点 (各単語の最後の文字を担っている頂点) の数
- : の末尾が担う頂点の先祖にある (自分自身を除く) ターミナル頂点の数
Trie 木の記録, 検索は文字列の長さに比例する計算時間で処理できる. よって, を合計で 時間で求めることができた.