x[i] != y[i] なインデックスを見つけて、それ以下を x[i], y[i] と逆の大小関係になるようにする。
自前のBigIntは略。
BigInt f(string a, string b, int idx, int S) { const int N = a.size(); if (a[idx] < b[idx]) ; else { swap(a[idx], b[idx]); --S; } for (int i = idx + 1; i < N && S; ++i) { if (a[i] < b[i]) { swap(a[i], b[i]); --S; } } for (int i = 0; i < N; ++i) { if (a[i] == b[i]) return BigInt(a) * BigInt(b); } if (S % 2) swap(a[N - 1], b[N - 1]); return BigInt(a) * BigInt(b); } class DigitsSwap { public: string maximalProduct(string x, string y, int swaps) { if (swaps == 0) return (BigInt(x) * BigInt(y)).toString(); const int N = x.size(); int idx = -1; for (int i = 0; i < N; ++i) { if (x[i] != y[i]) { idx = i; break; } } if (idx == -1) return (BigInt(x) * BigInt(y)).toString(); BigInt a = f(x, y, idx, swaps); BigInt b = f(y, x, idx, swaps); if (a < b) return b.toString(); else return a.toString(); } };