B.最低三元の文字列

リンク: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;
    }
    
}

 

公開された137元の記事 ウォン称賛15 ビュー9926

おすすめ

転載: blog.csdn.net/Luoriliming/article/details/103934382