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();
}
};