CODE FESTIVAL 2016 qual A C - 次のアルファベット / Next Letter
- 問題
- 解法
文字列を先頭から見ていく。今見ている文字がをaに変更できる場合、操作を何回か行ってaにしたほうが文字列は辞書式順序で小さくなる。変更できない場合そのままにしておくのが良い。
最後まで見て操作回数がまだ残っている場合、文字列の最後の文字に操作を行えば良い。
このとき愚直にK回操作を行うとTLEになる可能性がある。26回操作を行えば元の文字に戻ることを考えればKを26で割った余りの回数だけ操作を行えば良いことがわかる。
最後の文字以外でaが出現した場合操作を行う必要がないことに注意する。
#include <iostream> #include <string> #include <algorithm> #include <cstdio> #include <vector> #include <queue> #include <set> #include <numeric> #include <cmath> using namespace std; typedef long long int ll; #define all(x) x.begin(),x.end() const ll mod = 1e9+7; const ll INF = 1e9; const ll MAXN = 1e9; int main() { string s; int k; cin >> s >> k; int n = s.size(); for(int i = 0; i < n; i++){ if(('z'-s[i]) + 1 <= k && s[i] != 'a'){ k -= ('z'-s[i]) + 1; s[i] = 'a'; } if(i == n-1){ k %= 26; for(int j = 0; j < k; j++){ if(s[i] == 'z') s[i] = 'a'; else s[i]++; } } } cout << s << endl; return 0; }