CF c.swapレター

タイトル効果は、二つの等しい長さを与え、文字だけが含まれている、B列はS1、S2、変換方法は:多くの人がいるかどうか尋ねた後、文字S1 [i]は、S2 [j]は、無制限の為替交換することができます-1の出力しない場合、2つの文字列が同じであるような意見交換の後、各交換の最小数と二つの文字列内の2つの文字位置の交換場合に出力されてもよいです。

思考:要素のみ、bは=で[i]は、単に統計S1の2つです[i]をS2、S1 [i]を= AとS1ので、文字列が[i]の位置、S1 [にBを=!ここで、i] = Aが二つのスイッチング位置の集合、S1 [i]は= bは、同じ理由です。

AA

BB

数は奇数であり、数bが奇数である場合、最後の2つの工程

AB-> BB-> AB

AA AB

ABの数が奇数である場合には、何も解決しません

 

// する#include <文字列> 
の#include <ベクトル> 
書式#include <stdio.hに>
 の#pragma警告(無効:4996)を
 の#define MAXN 200000 + 33
 使って 名前空間はstdを、
ベクトル < int型 > A、B;
チャーS1 [MAXN]、S2 [MAXN]。
int型のn;
INT メイン()
{ 
    scanf関数(" %のD "、&N)
    scanf関数(" %sの"、S1 + 1 )。
    scanf関数(" %sの"、S2 + 1 )。
    ためにint型 i = 1 ; iが++; iが<= N 
    { 
        場合(!S1 [I] = S2 [i])と
        { 
            場合(S1 [i]が== ' ' )a.push_back(I)。
            
                b.push_back(I); 
        } 
    } もし、((a.size()+ b.size())&1)のprintf(" -1 " )。
    
    { INT RES = a.size()/ 2 + b.size()/ 2 もし(a.size()&1 && b.size()&1
    
        )RES + = 2 ; 
        printf(" %d個の\ n " 、RES)。
        以下のためにint型私= 0 ; I + 1 <a.size(); I + = 2 
            のprintf(" %D%D \ n "、[I]、[I + 1 ])。
        以下のためにint型 i = 0 ; I + 1 <b.size(); iは+ = 2 
            のprintf(" %D%D \ n "、B [I]、B [I + 1 ])。
        もし(a.size()&1&& b.size()&1 
        { 
            のprintf(" %D%D \ n "、[a.size() - 1 ]、[a.size() - 1 ])。
            printf(" %D%D \ n "、[a.size() - 1 ]、B [b.size() - 1 ])。
        } 
    } 
    
    戻り 0 

}

まずら、能力、気性を持っています。

。第二に、ら、スキル、気性を持っています。

第三に、誰が、ないスキル、誰よりも大きな気性。

 

おすすめ

転載: www.cnblogs.com/zxzmnh/p/11568890.html