官解里证明了答案一定是 smin 复制无限次的前缀。然后我就复制 K−1 次 smin,最后一次是 smin 的最短前缀。这咋 hack?
看到一种解法,就跑 10 次往前插最优的,然后最前面就只需要放最小的。正确性如何证明?
这是贪心代码。
int n, k;
cin >> n >> k;
vector<string> v(n);
for (int i = 0; i < n; i++) cin >> v[i];
string mn = *min_element(v.begin(), v.end());
if (k == 1) {
cout << mn;
return 0;
}
string ans, temp;
auto cmp = [&](string a, string b) -> bool {
string a1 = a + ans;
string b1 = b + ans;
return a1 <= b1;
};
for (int i = 0; i < min(10ll, k); i++) {
sort(v.begin(), v.begin() + n, cmp);
ans = v[0] + ans;
temp = v[0];
}
for (int i = 0; i < k - 10; i++) cout << temp;
cout << ans;