https://codeforces.com/contest/1102/problem/D
主要是满足字典序最小的时候。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
typedef long long ll;
int main(){
char s[300005];
int n,sum[3];
while(~scanf("%d",&n)){
scanf("%s",s);
sum[0] = 0,sum[1] = 0,sum[2] = 0;
for(int i=0;i<n;i++){
if(s[i] == '0')
sum[0]++;
else if(s[i] == '1')
sum[1]++;
else
sum[2]++;
}
int k=0;
if(sum[2] <= n/3)
{
if(sum[1]<n/3){//当1不足,2不足的时候,倒着先放2
for(int i=n-1;i>=0;i--){
if(sum[s[i]-'0']>n/3){
for(int j=2;j>=1;j--){
if(sum[j]<n/3){
sum[j]++;
sum[s[i]-'0']--;
s[i] = j+'0';
break;
}
}
}
}
}
else{//当2不足,1足的时候,先倒着放2,2放完了,再顺着放0
for(int i=n-1;i>=0;i--){
if(sum[s[i]-'0']>n/3){
for(int j=2;j>=2;j--){
if(sum[j]<n/3){
sum[j]++;
sum[s[i]-'0']--;
s[i] = j+'0';
break;
}
}
if(sum[2] == n/3)
{
k=i;
break;
}
}
}
}
for(int i=0;i<k;i++){
if(sum[s[i]-'0']>n/3){
for(int j=0;j<=1;j++){
if(sum[j]<n/3){
sum[j]++;
sum[s[i]-'0']--;
s[i] = j+'0';
break;
}
}
}
}
}
else {//当2足,0也足的时候
if(sum[0]>n/3){
for(int i=0;i<n;i++){//先顺着把2改了再倒着把0改了
if(s[i] == '2'){
s[i]='1';
sum[1]++;
sum[2]--;
}
if(sum[2] == n/3)
break;
}
for(int i=n-1;i>=0;i--){
if(s[i] == '0')
{
s[i]='1';
sum[1]++;
sum[0]--;
}
if(sum[1] == n/3)
break;
}
}
else//当2足,0不足的时候,顺着放01就好了
{
for(int i=0;i<n;i++){
if(sum[s[i]-'0']>n/3){
for(int j=0;j<=1;j++){
if(sum[j]<n/3){
sum[j]++;
sum[s[i]-'0']--;
s[i] = j+'0';
break;
}
}
}
}
}
}
printf("%s\n",s);
}
return 0;
}