https://atcoder.jp/contests/abc198/tasks/abc198_d
覆面算を解く問題。Send More Moneyって何?と思ったのですが SEND + MORE = MONEY
という覆面算が有名らしいです。
戦略としては、
S_1, S_2, S_3
に出てくる文字の集合を作る。10種類以上出てきたらUNSOLVABLE
- 先ほど文字の集合に番号をつける。順番はどうでもいい。
['v', 'f', 'c']
だったら v = 1番目、f = 2番目、のような対応づけをする。 - これにより、
S_1, S_2, S_3
が[3,5,1], [1,4,2], [2,2,2]
のような 1~10の整数の数列に変換できる。 - あとは 1
10番目の文字に対して 09 の数字をどのように当てはめるか全探索。 全探索しても10!=3628800通りなので間に合う。 Julia だと C++ におけるstd::next_permutaiton
が標準ライブラリに無い(存在を知らない) ので自分で作る必要がありますね。