ferinの競プロ帳

競プロについてのメモ

AGC022 A - Diverse Word

問題ページ
A - Diverse Word

考えたこと

  • Sに含まれない最小の文字を後ろにつけたせばよさそう
  • 26文字のが飛んでくるとつらい
  • zyxwvutsrq…みたいなのがsuffixについてるとその部分を大きくするのが不可能そうな気持ちになる
  • 頑張って探索しようとしたけど地味にこんがらがる
  • もっと愚直な全探索を考える
  • i番目の文字を変更するとき、今までにあらわれておらずs[i]より大きい最小の文字にするのが最善そう
  • O(|S|)個のSより大きい文字列のなかで最小のものを出力

300だし解けるやろ!wとか思って考え始めたら20分溶かしてつらい

ソースコード

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }
template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a){
  out<<'('<<a.first<<','<<a.second<<')';
  return out;
}
template<class T>
ostream &operator <<(ostream& out,const vector<T>& a){
  out<<'[';
  REP(i, a.size()) {out<<a[i];if(i!=a.size()-1)out<<',';}
  out<<']';
  return out;
}

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

bool used[30];
signed main(void)
{
  cin.tie(0);
  ios::sync_with_stdio(false);

  string s;
  cin >> s;

  vector<string> st;
  REP(i, s.size()) {
    REP(j, 26) {
      if(!used[j] && s[i]-'a' < j) {
        string t = s.substr(0, i) + (char)('a'+j);
        st.PB(t);
        break;
      }
    }
    used[s[i]-'a'] = true;
  }
  REP(j, 26) {
    if(!used[j]) {
      string t = s + (char)('a'+j);
      st.PB(t);
      break;
    }
  }

  sort(ALL(st));
  if(st.size() == 0) cout << -1 << endl;
  else cout << st[0] << endl;

  return 0;
}