题意:
在原字符串中修改数量最少,然后保证最小字典序。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
int a[100];
char s[N];
char ans[N];
int main()
{
scanf("%s",s);
int len=strlen(s);
memset(a,0,sizeof(a));
if(len%2==0)
{
for(int i=0;i<len;i++)
{
int x=s[i]-'a';
a[x]++;
}
for(int i=0;i<26;i++)
{
if(a[i]%2)
{
for(int j=25;j>i;j--)
{
if(a[j]%2)
{
a[j]--;
a[i]++;
break;
}
}
}
}
int s=0;
int t=len-1;
for(int i=0;i<26;i++)
{
if(a[i]&&a[i]%2==0)
{
while(a[i])
{
ans[s++]=i+'a';
ans[t--]=i+'a';
a[i]-=2;
}
}
}
ans[len]=' ';
printf("%s
",ans);
}
else
{
for(int i=0;i<len;i++)
{
int x=s[i]-'a';
a[x]++;
}
for(int i=0;i<26;i++)
{
if(a[i]%2!=0)
{
for(int j=25;j>i;j--)
{
if(a[j]&&a[j]%2!=0)
{
a[j]--;
a[i]++;
break;
}
}
}
}
int s=0;
int t=len-1;
for(int i=0;i<26;i++)
{
if(a[i]&&a[i]%2==0)
{
while(a[i]>0)
{
a[i]-=2;
ans[s++]=i+'a';
ans[t--]=i+'a';
}
}
if(a[i]&&a[i]%2!=0)
{
while(a[i]>1)
{
a[i]-=2;
ans[s++]=i+'a';
ans[t--]=i+'a';
}
ans[len/2]=i+'a';
}
}
ans[len]=' ';
printf("%s
",ans);
}
return 0;
}