Problem: 2050D - Digital string maximization
Language: c++23 

Code 1:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fi first
#define se second
#define PII pair<int,int>
#define PIC pair<int,char>
#define PCI pair<char,int>
#define PCC pair<char,char>
int fx[8]={1,-1,0,0,1,-1,-1,1};
int fy[8]={0,0,-1,1,1,-1,1,-1};
const int inf=1e16;
const int N=1e6+10;
const int INF=9e18;
const int mod=1e9+7;
//括号最短匹配问题，记录左括号的数量，按需匹配即可，如果需要计算，则用栈计算。
//a =" " + a, 判断a字符串要加" ";
//a*b=n,跑两层循环不会爆，调和级数,埃式塞法
//log2 (1e9) = 30
// &,|的优先级比！=低要注意。
// i % 4 + 1//范围1~~4循环
//一个有序数组，upper_bound(r)-lower_bound(l)为区间[l,r]的个数。
//vector<map<string,map<string,int>>>p(n+10);再用一个map<string,int>
//即可达成p[i][sa][sb]三个字符串来确定一条边的个数。
//选择max(l,fi)和min(r,se)即可让重复的区间减少最多。
//需要考虑分配问题的时候，可以直接判断阈值，然后再进行平均分配即可。
//遇到最值问题直接考虑二分
//前缀积要爆，遇到l,r就要考虑前缀和。
//遇到不等式，把相同变量移到同一边。
//遇到两个数要满足某个条件，则可以用map<条件，int>的方式算出组合数。
//long long 7e18
//遇到消除字符串特定字符，用栈堆实现
//遇到一段长度求区间个数，利用左右区间前缀和，相减即可。
//遇到迷宫就改建筑,end!=make_pair(1ll,1ll)
//当遇到环形问题的时候，我们可以在后面接一个数组从而达成环形条件。
//如果遇到只能转移到后面，则我们考虑挨个转移即可。
//质数在2e5范围内大概15间隔一个。
//当遇到两种状态，其中一种最优，但是最后需要另一种优化，可以用dp优化一下
//当需要进行整体最大值递归的时候，只需要定义一个全局变量进行比较即可



int n,m   ;
int a[N];

void solve(){
	string s;
	cin>>s;
	for (int k=1;k<=50;k++){
		for (int i=0;i<s.size()-1;i++){
			if(s[i]<s[i+1]-1) {
				swap(s[i],s[i+1]);
				s[i]-=1;
			}
		}
	}
	for (int i=0;i<s.size();i++){
		cout<<s[i];
	}
	cout<<endl;
	
	
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
		
	}
	
	return 0;
}
/*
  
  
 */

Code 2:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fi first
#define se second
#define PII pair<int,int>
#define PIC pair<int,char>
#define PCI pair<char,int>
#define PCC pair<char,char>
int fx[8] = {1, -1, 0, 0, 1, -1, -1, 1};
int fy[8] = {0, 0, -1, 1, 1, -1, 1, -1};
const int inf = 1e16;
const int N = 1e6 + 10;
const int INF = 9e18;
const int mod = 1e9 + 7;
//括号最短匹配问题，记录左括号的数量，按需匹配即可，如果需要计算，则用栈计算。
//a =" " + a, 判断a字符串要加" ";
//a*b=n,跑两层循环不会爆，调和级数,埃式塞法
//log2 (1e9) = 30
// &,|的优先级比！=低要注意。
// i % 4 + 1//范围1~~4循环
//一个有序数组，upper_bound(r)-lower_bound(l)为区间[l,r]的个数。
//vector<map<string,map<string,int>>>p(n+10);再用一个map<string,int>
//即可达成p[i][sa][sb]三个字符串来确定一条边的个数。
//选择max(l,fi)和min(r,se)即可让重复的区间减少最多。
//需要考虑分配问题的时候，可以直接判断阈值，然后再进行平均分配即可。
//遇到最值问题直接考虑二分
//前缀积要爆，遇到l,r就要考虑前缀和。
//遇到不等式，把相同变量移到同一边。
//遇到两个数要满足某个条件，则可以用map<条件，int>的方式算出组合数。
//long long 7e18
//遇到消除字符串特定字符，用栈堆实现
//遇到一段长度求区间个数，利用左右区间前缀和，相减即可。
//遇到迷宫就改建筑,end!=make_pair(1ll,1ll)
//当遇到环形问题的时候，我们可以在后面接一个数组从而达成环形条件。
//如果遇到只能转移到后面，则我们考虑挨个转移即可。
//质数在2e5范围内大概15间隔一个。
//当遇到两种状态，其中一种最优，但是最后需要另一种优化，可以用dp优化一下
//当需要进行整体最大值递归的时候，只需要定义一个全局变量进行比较即可



int n, m   ;
char s[N];

void solve()
{
	string s;
	cin >> s;
	int sum = 0, cnt = 0, kk = 0;
	for (int i = 0; i < s.size(); i++)
	{
		sum += s[i] - '0';
		if (s[i] == '2') cnt++;
		else if (s[i] == '3') kk++;
	}
	if (sum % 9 == 0) cout << "Yes" << endl;
	else
	{
		for (int i = 0; i <= min((int)25, cnt); i++)
		{
			for (int j = 0; j <= kk; j++)
			{
				int  sum1 = sum + 2 * i + j * 6;
				if (sum1 % 9 == 0)
				{
					cout << "Yes" << endl;
					return ;
				}
			}
		}
		cout << "No" << endl;
	}
}
signed main()
{
	ios::sync_with_stdio(false), cin.tie(0);
	int _ = 1;
	cin >> _;
	while (_--)
	{
		solve();

	}

	return 0;
}
/*


 */

Answer: 1