はまやんはまやんはまやん

hamayanhamayan's blog

One More aab aba baa [AtCoder Beginner Contest 215 C]

https://atcoder.jp/contests/abc215/tasks/abc215_c

解説

https://atcoder.jp/contests/abc215/submissions/25247677

今回要求されている問題を実装できるかという問題となる。
前半と後半でやればいい。

文字列Sの各文字を並べ替えて作ることが可能な文字列を辞書順にすべて列挙

こっちがほぼ本質。
並び替えて作れる文字列は順列の組み合わせ数となるので、8765432*1=40320通りとなる。
これは全列挙できる個数であるので、全列挙しよう。

C++であればdo-whileとnext_permutationを使えば、簡単に並び替えて作ることができる文字列を列挙できる。
これを使わない場合はdfsとかで頑張る感じになると思う。
「順列列挙」辺りのキーワードで探せば出てくると思う。

前からK番目にくる文字列を求める

こっちは単純に前からK番目を出力するだけ。

string S; int K;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> S >> K;

    vector<string> cands;

    sort(all(S));
    do {
        cands.push_back(S);
    } while (next_permutation(all(S)));

    cout << cands[K - 1] << endl;
}