解説
一般的にどの言語でもASCII Codeというものがある。細かく覚える必要はないが、(char)('A'+$1$)-'B'、(char)('Z'-$25$)='A'という感じで、アルファベット表みたいな感覚で文字変換ができる(ここでchar型変換をしないと、整数型になってしまうので注意)。
1文字目は(char)($s_0-1$),2文字目は(char)($s_1-2$)という感じで続けるのだが、ここで注意が必要。
まず$26$文字目以降だ。これ以降は、わざわざ$26$とか$42$とか大きな数字で引く必要はない。よって、for文を回すときは、($s_i-(i+1)mod26$)という感覚でやると割といい感じになる。なお、そのわざわざ%mod6する理由は次にある。
続いて、入出力例2のパターンだ。この問題の制約下では'A'-1='Z'にしろという命令が暗にあるが、このままただ'A'-1をすると'@'になってしまう。これの対処法は、(i+1)mod26%をした後場合分けをする。$'A'\leqq s_i\leqq 'Z'$がfalseだったら**$s_i+=26$**をする。そうでなければ何もしない。これで大丈夫。
C++の解答例
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;cin>>s;
for(int i=0;i<s.size();i++){
s[i]=(char)(s[i]-(i+1)%26);
if(!('A'<=s[i]&&s[i]<='Z'))s[i]+=26;
}
cout<<s<<endl;
}