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

hamayanhamayan's blog

Second Permutation [yukicoder 927]

https://yukicoder.me/problems/no/927

解説

https://yukicoder.me/submissions/399615

2番目に大きいものとあるが、最も大きいものを考えてみる。
与えられた文字を降順で並べると、最大の数が得られる。
サンプル1にもあるように、最大の321の下2桁をスワップすると、2番目が得られる。
問題は9911のような場合である。
この場合は9191とするのが2番目。
なので、基本的には降順で並べて、下の桁から数の境目を探して、そこだけswapすると答え。
スワップした結果、最大と同じになったり、0-leading(0から始まる)数になったら-1

string X;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> X;
    sort(all(X), greater<char>());

    string ans = X;

    int n = X.length();
    rrep(i, n - 2, 0) if (ans[i + 1] != ans[i]) {
        swap(ans[i], ans[i + 1]);
        break;
    }

    if (ans == X or ans[0] == '0') cout << -1 << endl;
    else cout << ans << endl;
}