给定排序间隔字符的范围,咋一看感觉很复杂,其实也就三种情况:
- l=r,将字符串分组排序后输出即可
- n>=2*l,这种情况下所有的字符都可以放到一个组里(证明略),直接对原字符串排序输出即可
- n<2*l,对于中间位置的字符,比如位置 i 满足 i < l 并且 n - i < l,那么这个字符无法和其他位置交换,因此输出的时候不改变顺序,剩下两端的字符可以互换位置,因此将两端的字符放到一个集合中,排序输出即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n, l, r, cnt = 0;
string str, tmp;
cin >> n >> l >> r;
cin >> str;
if (l == r)
{
for (int i = 0; i < l; i++)
{
tmp.clear();
cnt = 0;
for (int j = i; j < n; j += l)
tmp += str[j];
sort(tmp.begin(), tmp.end());
for (int j = i; j < n; j += l)
str[j] = tmp[cnt++];
}
}
else if (n < l + l)
{
for (int i = 0; i < n; i++)
{
if (i >= l || i < n - l)
tmp += str[i];
}
sort(tmp.begin(), tmp.end());
for (int i = 0; i < n; i++)
{
if (i >= l || i < n - l)
str[i] = tmp[cnt++];
}
}
else
sort(str.begin(), str.end());
cout << str;
return 0;
}