Codeforcesラウンド#598(DIV。3)D.バイナリ列の最小化

あなたは長さのバイナリ文字列与えられ  、N、N(すなわちする。からなる文字列  のn n文字「0」と「1」)。

1つの動きでは、文字列の隣接する二つの文字を入れ替えることができます。あなたが行うことができない場合は、指定されたものから入手できる辞書順最小の可能な文字列は何である  高々  k個の k個の移動は?あなたがまったくの移動を実行しないことも可能です。

もしインデックスを有する隣接文字の同じペアを交換できることに注意してください  iは iと  I + 1回のI + 1の任意の(おそらく、ゼロ)の数。各そのようなスワップは、別の移動であると考えられます。

あなたは答えなければならない  のq qは独立したテストケースを。

入力

入力の最初の行は1つの整数含ま  Qの Q(1 Q 10 4のテストケースの数- 1≤q≤104)。

テストケースの最初の行は、二つの整数含ま  N nおよび  k個の K(1 N 10 6 1 K N 2文字列の長さと数- 1≤n≤106,1≤k≤n2)を動きのあなたが行うことができます。

テストケースの2行目は、以下からなる1つの文字列が含まれている  N n文字「0」と「1」。

それが保証されるの和  N N超えないすべてのテストケース上  10 6 106(Σ N 10 6 Σn≤106を)。

出力

長さの辞書式に最小の可能な列:各テストケースのために、その上に解答を印刷  N nは実行できる場合は、指定されたものから得ることができない  せいぜい  Kの K移動します。

入力
コピー
3 
8 5 
11011010 
7 9 
1111100 
7 11 
1111100
出力
コピー
0101.111万
0101111 
0011111
注意

次のように最初の例では、文字列を変更することができる:  1 10 --- 11010 10 --- 111010 0111 10 --- 10 011 10 --- 110 01 10 --- 1110 01011110 110_11010を→ 10_111010→011110_10→01110_110→0110_1110→01011110。

第三の例では、ソートされた文字列を作るのに十分な操作があります。

 

前方に移動するようにしてください0

書式#include <iostreamの> 
の#include < 文字列 > 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
int型のmain(){ 
    IOS :: sync_with_stdio();
    int型Q; 
    cinを >> Q;
    一方、(q-- ){
         int型N。
        長い 長いK; 
        CIN >> N >> K。
        文字列sの。
        cinを >> 秒;
        int型 J = 0 ;
        以下のためのint型= I 0、I <N - 、I ++ ){
             IF(J <I)J = I;
             一方(J <N - && S [J] =!' 0 ')J ++;   // 判断した場合、いくつかの前の前の0 1 
            IF(J <N - && J - I <= K){ //は過去直接シフトか否かを判断する
                。スワップ(S [I]、S [J])
                K - J = - I; 
            } 
        } 
        COUT << S < < ENDL; 
    } 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/QingyuYYYYY/p/11802885.html