リンク:https://codeforces.com/problemset/problem/1215/C
Monocarp 2つの文字列を持っている のS秒と Tの Tは、等しい長さを持ちます。両方の文字列が小文字のラテン文字「で構成さ」と「B」。
Monocarpは、これら二つの文字列にしたい のS、Sと Tの互いに等しいトンを。彼は、次の操作を何度でも行うことができますインデックスの選択 のP O S 1列でPOS1 秒秒、インデックス選択 のP O S 2列でPOS2 トンのトンを、スワップ S のP O S 1とspos1 トンのP O の2 tpos2。
あなたはMonocarpを作るために実行しなければならない操作の最小数を決定する必要が S、Sおよび Tトン等しい、と操作のいずれかの最適なシーケンスを印刷する-またはこれらの文字列が等しいことは不可能であると言います。
最初の行は、一つの整数含有 N、N (1 ≤ N ≤ 2 ⋅ 10 5 )の長さ- (1≤n≤2⋅105) のS、Sと Tの Tを。
2行目は1つの文字列含ま S Sは、以下からなる N n文字「」と「B」。
第三行は、1つの文字列を含んでい たTからなるTを N n文字「A」と「B」。
それはこれらの文字列が等しいことは不可能である場合は、印刷 - 1 -1。
そうでなければ、最初の行の印刷における k個のk -文字列を等しくするために必要な操作の最小数。次のそれぞれにおける k個の文字列内のインデックス- K線は2つの整数を印刷 S文字列中のSおよびインデックス のT対応するスワップ動作で使用されるべきであるT。
問題の意味:他の二つの線で組成物A、Bを与えられた文字列の長さは、それ以外の場合、出力の順序を変更すること、それらが等しい場合の文字は、垂直交換に等しいかどうかを尋ね-1
溶液:秒間[I]、T [i]は、2種類のみ(B)、または(B、A)、マッチングの同じ種類の残りの1つの又は2種が残っていない場合、等しくありませんそれは等しいか等しくすることはできません。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefのペア < int型、int型 > PII。 const int型 MAXN = 2E5 + 5 。 チャーS [MAXN]、T [MAXN]。 ベクトル < 整数 > V1、V2; ベクトル <PII> ANS; INT のmain() { int型LEN。 scanf関数(" %のD "、およびLEN)。 scanf関数(" %sの%sの"、S + 1、T + 1 )。 以下のための(int型 I = 1 ; 私は= LENを<; 私は++ ) { もし、(S [I] == ' ' && T [I] == ' B ' )v1.push_back(I)。 もし(S [I] == ' B ' && T [I] == ' ' )v2.push_back(I)。 } INT lasta = 0、lastb = 0 。 以下のために(int型私= 1 ; iが(v1.sizeを<); I = I + 2 ) ans.push_back(PII(V1 [i]が、V1 [I - 1 ]))。 以下のための( int型 I = 1 ; i)は(v2.sizeを<; I = I + 2 ) ans.push_back(PII(V2 [i]は、V2 [I - 1 ]))。 もし(v1.size()%2)lasta = V1 [v1.size() - 1 ]。 もし(v2.size()%2)lastb = V2 [v2.size() - 1 ]。 もし((lasta && lastb == 0)||(lasta == 0 && lastb)){ のprintf(" -1 ")。リターン 0 ; } であれば(lasta){ ans.push_back(PII(lasta、lasta))。 ans.push_back(PII(lasta、lastb))。 } printf(" %d個の\ n " 、ans.size())。 以下のために(int型 i = 0 ; iはans.size()<; iは++ ) のprintf(" %D%D \ n " 、ANS [i]が1次回、ANS [I] .second)。 リターン 0 ; }