ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Benelux Algorithm Programming Contest 2016 B Battle Simulation

問題

敵が3つの技をうってくるので、それに対応したコマンドをこちらが入力してください、という問題です。
RにはS、BにはK、LにはHを出力します。
基本的に、1対1でコマンドが対応していますが、それとは別に、
3つすべて違う技を連続してうってきた場合のみ、普段とは違ってCというコマンドを入力する、という条件があります。

解法

割と愚直に実装しました。
…のですが、かなりごちゃごちゃしてしまいました。
3種類の敵のコマンドをカウントして、3つたまったらその都度こちらも古い方からコマンドを出力していきます。
最後の端数だけ最後にいっぺんに出力します。
絶対もっと何か綺麗な実装方法があると思いますね…
提出コードは以下になります。

#include <bits/stdc++.h>
using namespace std;

string s;
int cnt[3] = {0};
int lst[27] = {0};
int cmnd[3] = {0};

int main() {
  cin >> s;
  lst['R' - 'A'] = 0;
  lst['B' - 'A'] = 1;
  lst['L' - 'A'] = 2;
  cmnd[0] = 'S';
  cmnd[1] = 'K';
  cmnd[2] = 'H';
  for(int i = 0; i < s.size(); ++i) {
    ++cnt[lst[s[i] - 'A']];
    if(cnt[0] + cnt[1] + cnt[2] < 3)
      ;
    else if(cnt[0] * cnt[1] * cnt[2] == 1) {
      cout << 'C';
      cnt[0] = cnt[1] = cnt[2] = 0;
    }
    else {
      cout << (char)(cmnd[lst[s[i - 2] - 'A']]);
      --cnt[lst[s[i - 2] - 'A']];
    }
    if(i == s.size() - 1)
      for(int j = s.size() - (cnt[0] + cnt[1] + cnt[2]);
          j < s.size(); ++j)
        cout << (char)cmnd[lst[s[j] - 'A']];
  }
  cout << endl;
  return 0;
}