题意:给你一个仅由'0','1','2'组成的字符串,然后有2种变换方式,一种是0和1交换位置,另一种是1和2交换位置。问经过任意次的变化得到的字典序最小的字符串。

题解:显然题中只有0,1,2三种数,而1可以与0和2任意交换,则1可以移动到字符串的任何位置,而0和2的移动都与1有关,说明一旦1确定0,2的位置自然确定。那么我们只需要先将所有的1删掉然后全部放在第一个2的前面就行(注意可能没有2,所以要特判,坑!!!)

AC代码:

#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <cstdio>
#include <algorithm>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int maxn=1e6+5;
int num[maxn],a[maxn];
main() {
string s;
cin>>s;
int cnt=0;
string ans;
for(int i=0;i<s.size();i++){
if(s[i]=='1')cnt++;
if(s[i]=='0')ans+="0";
if(s[i]=='2')ans+="2";
}
int flag=1;
for(int i=0;i<ans.size();i++){
if(ans[i]=='2'&&flag){
flag=0;
for(int j=1;j<=cnt;j++)cout<<"1";
cout<<ans[i];
continue;
}
cout<<ans[i];
}
if(flag)for(int j=1;j<=cnt;j++)cout<<"1";
cout<<endl;
}