GCJ 2016 Round 1B A: Getting the Digits

解法

一意に定まる。

コード

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

string solve(const string &S) {
  map<int, int> cnt;
  for (int i = 0; i < S.size(); ++i) cnt[S[i]]++;

  vector<int> ans(10, 0);
  ans[0] = cnt['Z'];
  ans[2] = cnt['W'];
  ans[6] = cnt['X'];
  ans[8] = cnt['G'];
  ans[4] = cnt['U'];
  ans[3] = cnt['H'] - ans[8];
  ans[1] = cnt['O'] - ans[0] - ans[2] - ans[4];
  ans[5] = cnt['F'] - ans[4];
  ans[7] = cnt['V'] - ans[5];
  ans[9] = cnt['I'] - ans[5] - ans[6] - ans[8];
  string T = "";
  for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < ans[i]; ++j) {
      T.push_back(i + '0');
    }
  }

  return T;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int T;
  cin >> T;
  for (int testcase = 1; testcase <= T; ++testcase) {
    string S;
    cin >> S;

    cout << "Case #" << testcase << ": ";
    cout << solve(S) << endl;
  }
}