这题显然贪心。
我用了一个双指针枚举。
当两个字母均为奇数个时,把一个字典序较大的改成较小的。
代码如下,不懂看注释。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
char a[maxn+20];
int b[128];
int n;
signed main(){
cin>>a;
n=strlen(a);
for(int i=n;i>=1;i--) a[i]=a[i-1]; // 强迫症
for(int i=1;i<=n;i++) b[a[i]-96]++; // 桶计数
if(!(n&1)){ // 长度为偶数
int l=1,r=26; // 双指针枚举奇数个
while(l<=r){
while(!(b[l]&1)&&l<=26) l++;
while(!(b[r]&1)&&r>=1) r--;
b[l]++;
b[r]--;
}
// 以下输出
for(int i=1;i<=26;i++){
for(int j=1;j<=(b[i]>>1);j++) cout<<char(96+i);
}
for(int i=26;i>=1;i--){
for(int j=1;j<=(b[i]>>1);j++) cout<<char(96+i);
}
}else{ // 长度为奇数
int l=1,r=26;
while(l<r){
while(!(b[l]&1)&&l<=26) l++;
while(!(b[r]&1)&&r>=1) r--;
b[l]++;
b[r]--;
}
// 以下输出
for(int i=1;i<=26;i++){
for(int j=1;j<=(b[i]>>1);j++) cout<<char(96+i);
}
cout<<char(96+l);
for(int i=26;i>=1;i--){
for(int j=1;j<=(b[i]>>1);j++) cout<<char(96+i);
}
}
return 0;
}