TechFUL: 文字変化(Easy)

問題概要

英語の小文字からなる長さ  L の文字列  S が与えられる.

Tech ちゃんはこの文字列の  i 番目  (1 \le i \le | S |) の文字  S_{i} に対して次の二つの操作を行うことができる.

操作 A : 1 ポイントを使用して、文字  S_{i} を辞書順に一つ次の文字に変化させる.z の一つ次の文字は a である.

操作 B : 1 ポイントを使用して、文字  S_{i} を辞書順に一つ前の文字に変化させる.a の一つ前の文字は z である.

文字列  S から文字列  T に変化させるのに必要な最小ポイントを求めよ.

制約

  •  1 \le L \le 10^{5}

  •  | S | = | T | = L

  •  S, T は英子文字からなる文字列.

解法

文字  S_{i} T_{i} に変化させる方法として、操作 A のみを繰り返すか、操作 B のみを繰り返すかの二通りのみを考えればいい.

 S_{i}, T_{i} の辞書順における番号をそれぞれ  s, t とする.

 s \le t のとき、

  • 操作 A のみを繰り返す場合の操作回数は  t - s 回.

  • 操作 B のみを繰り返す場合の操作回数は  26 + s - t

 s \gt t の場合も同様に求められる.

#include <bits/stdc++.h>
using namespace std;

int main() {
    int L;
    string S, T;
    cin >> L >> S >> T;
    int ans = 0;
    for (int i = 0; i < L; ++i) {
        if (S[i] > T[i]) swap(S[i], T[i]);
        ans += min(T[i] - S[i], 26 + S[i] - T[i]);
    }
    cout << ans << endl;
}