ykmakuのブログ

競技プログラミングをがんばるブログ

CODE FESTIVAL 2016 qual A C - 次のアルファベット / Next Letter

  • 問題

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