AtcCoder Beginner Contest 268 参加記録
コンテストページ:UNIQUE VISION Programming Contest 2022 Summer (AtCoder Beginner Contest 268) - AtCoder
コンテスト中AC:A〜D
D - Unique Username
文字列の並べ替え方が通りです。
アンダーバーの入れ方ですが、まず、アンダーバーを入れる残り個数は、文字数の合計をとすると、です。
アンダーバーの入れ方は、区別のない個のボールと区別のない個の仕切りを並べる方法の総数に一致するので、通りです。
以上から、ありうるユーザー名の個数は、通りですが、いずれか一方が大きいともう一方は小さくなるので、少なそうだと予測できます。
厳密に全て確かめたい場合は、の文字数が全て1の場合に最も個数が多くなるはずなので、まで計算してみればよいかなと思います(コンテスト中はそこまでしませんでした)。
というわけで、全探索して問題なさそうです。(書いていて気づきましたが、個数が少ないとか関係なく、鳩の巣原理からになりそうです。)
あとは、ユーザー名の生成方法です。
実装としては、順列全探索で文字列の並べ替え方を全部試し、その全てについてDFSでアンダーバーを付けていきました。詳細は実装を見てもらった方が早そうです。
Submission #34748520 - UNIQUE VISION Programming Contest 2022 Summer (AtCoder Beginner Contest 268)