リンク:https://codeforces.com/problemset/problem/1009/B
あなたが三元の文字列(それが唯一の文字「0」、「1」と「2」からなる文字列である)が与えられました。
あなたは交換することができ、任意の2つの隣接する(連続した)文字「0」と「1」(すなわち置き換える「01」「10」を持つまたはその逆)、または任意の2つの隣接(連続した)文字「1」と「2」(すなわち置換」 12" と 『21』またはその逆)。
たとえば、文字列「010210」のために、私たちは、次の移動を行うことができます。
- "010210" →→ "100210"。
- "010210" →→ "001210"。
- "010210" →→ "010120"。
- "010210" →→ "010201"。
あなたが「02」→→「20」を交換し、その逆はできませんよりも、注意してください。あなたは、与えられた文字列は、上記を除くと、他の操作を実行することはできません。
あなたのタスクは、これらのスワップを任意の回数(おそらく、ゼロ)を用いて最小可能(辞書)文字列を取得することです。
S ||よ| | | |1≤i≤| |、文字列のAAは、いくつかの位置II(1≤i≤が存在する場合(文字列のAAとBBは同じ長さを持っている場合)辞書順少ない文字列BBよりもありますすべてのjに対して<IJ <私はAJ = bjaj = BJを保持しており、<BI <biaiがaiをするような文字列SSの長さ)。
入力
入力の最初の行のみからなる文字列SSを含ん文字「0」、「1」、「2」、その長さが11乃至105105(両端を含む)です。
出力
可能(辞書)文字列を使用すると、任意の回数(おそらく、ゼロ)上述のスワップを使用して得ることができる最小 - 単一の文字列を印刷します。
例
入力
コピー
100210
出力
コピー
001120
入力
コピー
11222121
出力
コピー
11112222
入力
コピー
20
出力
コピー
20
コード:
#include <bits/stdc++.h>
using namespace std;
long long t,n,m,k,y,s=0,sum=0,min1=0,max1=0;
char x[100005];
long long s1=0,s2=0,s0=0;
long long p[100005];
int main()
{
cin>>x;
n=strlen(x);
int j=0;
for(int i=0;i<n;i++)
{
if(x[i]=='2')
s2++;
if(x[i]=='1')
s1++;
if(x[i]=='0')
s0++;
if(x[i]=='2')
{
j++;
p[j]=s0;
s0=0;
}
}
if(j>=1)
{
for(int i=1;i<=p[1];i++)
cout<<0;
}
else
{
for(int i=1;i<=s0;i++)
cout<<0;
}
for(int i=1;i<=s1;i++)
cout<<1;
if(s2>=1)
{
cout<<2;
s2--;
}
for(int i=2;i<=j;i++)
{
for(int o=1;o<=p[i];o++)
{
cout<<0;
}
if(s2>=1)
{
cout<<2;
s2--;
}
}
if(j>=1)
{
for(int i=1;i<=s0;i++)
cout<<0;
}
}