C - abc285_brutmhyhiizp Editorial by rsk0315


簡単のため、A から Z の代わりに、一旦 1 から 9 のみを同様の規則で並べた ID を一旦考えます。左側がその ID で、右側がその ID が小さい方から何番目かを表します。

  1  ->  1
  2  ->  2
  3  ->  3
...
  9  ->  9
 11  -> 10
 12  -> 11
...
 19  -> 18
 21  -> 19
 22  -> 20
...
 91  -> 82
 92  -> 83
...
 99  -> 90
111  -> 91
...

これを見ると、「各桁が 1, 2, …, 9 であるような 9 進法」かのように解釈して、「各桁が 0, 1, …, 9 の(通常の)10 進法」に直す操作に対応することがわかります。

たとえば、“92” → 83 への変換は \(9\cdot 9^1 + 2\cdot 9^0 = 83\) で、“111” → 91 への変換は \(1\cdot 9^2 + 1\cdot 9^1 + 1\cdot 9^0 = 91\) のような感じです。

これを踏まえると、元々の問題は「各桁が 1 (=A), 2 (=B), …, 26 (=Z) であるような 26 進法」を通常の 10 進法に直す操作となり、以下のような実装で済むとわかります。

提出 #38160122

#include <iostream>
#include <string>

int main() {
  std::string s;
  std::cin >> s;
  
  long res = 0;
  for (auto c: s) {
    res *= 26;
    res += c - '@';
  }
  std::cout << res << '\n';
}

(C++ での文字コードは処理系定義ですが、ASCII においては)'@' == 'A' - 1 なので、よくある c - 'A' + 1 の代わりに c - '@' と書くこともできます。

posted:
last update: