Azamon Web Services - #607 b

#文字列

注意

for文でやると事故りやすそう
for文でやるというのは, sを前から見て, s[i] == c[i]の間はcontinueして,
とか
s[i] > c[i]なら, sのi + 1番目以降でc[i]より小さいの探す
ただ, i + 1番目がなかったら?
すなわち, i番目が最後のとき

また, sがcより短いとき, continueし続けて終わったり

解法

一発でswapするの決めたいが, 出来るだけ後ろの文字とswapする

ケース

UBLZB BSX
BBLZU
最初のUで, 2番目のBと交換してしまう恐れ

CCC CC
---
cがsより短いとき
forでやる場合条件忘れてないか

F GZ
F
上の注意で書いた, i + 1番目以降探せない例

他人のコード

while (T --) {
    cin >> a >> b;
    int x = -1, sx = 0, sy = 0;
    for (int i = (int)a.length() - 1; i >= 0; i --) {
        // swapするsx, sy決める
        // xはiより後ろの, iより後ろで一番小さいの
        if (x != -1 && a[i] > a[x]) {
            sx = x;
            sy = i;
        }
        // ひたすら小さい文字探す
        if (x == -1 || a[i] < a[x]) {
            x = i;
        }
    }
    swap(a[sx], a[sy]);
    if (a < b) {
        cout << a << endl;
        } else {
            cout << "---" << endl;
        }
    }
}

https://codeforces.com/contest/1281/submission/66904183