タイトル効果は、二つの等しい長さを与え、文字だけが含まれている、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 。 }
まずら、能力、気性を持っています。
。第二に、ら、スキル、気性を持っています。
第三に、誰が、ないスキル、誰よりも大きな気性。