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番目の文字に対して 0~9 の数字をどのように当てはめるか全探索。 全探索しても10!=3628800通りなので間に合う。 Julia だと C++ における std::next_permutaiton が標準ライブラリに無い(存在を知らない) ので自分で作る必要がありますね。

https://atcoder.jp/contests/abc198/submissions/32308692