[CF1799C] Double Lexicographically Minimum 题解
aeiouaoeiu · · 题解
字典序最小化的一个一般做法就是按位确定。设
如果能够满足,就向两端填入
但是,设次次小字符为
::::info[code]
#include<bits/stdc++.h>
#define pb emplace_back
#define mp make_pair
using namespace std;
typedef unsigned long long ll;
typedef __int128 LL;
const ll maxn=200007,ee=1e18;
ll n;
string s,ans;
void solve(void){
for(ll i=0;2*i+1<n;i++){
if(s[2*i]==s[2*i+1]) ans[i]=ans[n-1-i]=s[2*i];
else{
ans[i]=s[2*i+1],ans[n-1-i]=s[2*i];
if(2*(i+1)>=n) return;
if(s[n-1]==s[2*i+1]){
for(ll j=i;j<=n-1-i;j++) ans[j]=s[n-1];
ans[n/2]=s[2*i];
return;
}
for(ll j=i+1,c=2*i+2;j<n-1-i;j++,c++) ans[j]=s[c];
return;
}
}
if(n&1) ans[n/2]=s[n-1];
}
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
ll T=1; cin>>T;
for(;T--;){
cin>>s,n=s.length();
ans.resize(n);
sort(s.begin(),s.end());
solve();
cout<<ans<<"\n";
}
return 0;
}
::::