KUPC2017 C - Best Password

解説

できるだけ一文字目の方に大きい文字(z,y,x,...,a)を作っていく。繰り上げしていくイメージ。

Ai C[S_i] + Ai+1 C[S_(i+1)] => Ai (C[S_i] + A) + Ai+1 * (C[S_(i+1)] - 1)。

N文字目から繰り上げできるだけしていく。

コード

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <cmath>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <bitset>
#include <cstring>
#include <deque>
using namespace std;
#define FOR(I,A,B) for(int I = (A); I < (B); ++I)
#define CLR(mat) memset(mat, 0, sizeof(mat))
typedef long long ll;
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  int A; cin >> A;
  string s; cin >> s;
  int N = s.length();
  int C[N];
  FOR(i,0,N) C[i] = s[i] - 'a' + 1;
  FOR(i,0,N) {
    for(int j = N - 1; j > 0; j--) {
      // j -> j - 1にできるだけ繰り上げする
      while(C[j-1] + A <= 26 && C[j] > 0) {
        C[j-1] += A;
        C[j]--;
      }
    }
  }
  FOR(i,0,N) {
    if(C[i] == 0) break;
    cout << char(C[i]-1+'a');
  }
  cout << endl;
  return 0;
}