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;
}