yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

M-SOLUTIONS プロコンオープン2021(AtCoder Beginner Contest 232) B - Caesar Cipher

問題の要約
 英小文字からなる文字列Sを持っている。
 文字列Sに対して、下記の操作をちょうど1回行う。
  ・まず、非負整数Kを選ぶ。
  ・その後、Sの各文字をK個後ろの英小文字に変更する。
 ただし、
  ・aの1個後ろの英小文字はbであり、
  ・...
  ・zの1個後ろの英小文字はaである。
 文字列Tが与えられる。上記の操作によってSをTと一致させることができるか判定せよ。
制約
 SとTはそれぞれ英小文字からなる長さ1以上10^5以下の文字列
 Sの長さとTの長さは等しい
入力
 S
 T
考え方
 1,SとTのそれぞれの位置の差が全部同じならばよい。
 2,S[i],T[i]はcharなのでそのまま差が計算できる。
 3,0<=T[i]-S[i]のときはそのまま差を計算する。
 4,T[i]-S[i]<0のときは26(アルファベットの数)を足して正に直す。
 5,差が全部同じかどうか調べて、同じならYes、そうでないならばNoを出力。

実際のプログラム
#include<iostream>
#include<string>
#include<vector>

using namespace std;

int main(){
  string S,T;
  cin >> S >> T;
  long long N = S.size();
  
  vector<int> gap(N);
  for(long long i = 0; i < N; i++){
    if(0 <= T[i]-S[i]){
      gap[i] = T[i]-S[i];
    }else{
      gap[i] = 26+T[i]-S[i];
    }
  }
  int GAP = gap[0];
  bool flag = true;
  for(long long i = 0; i < N; i++){
    if(gap[i] != GAP){
      flag = false;
    }
  }
  
  if(flag){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }
  
  return 0;
}