Monocarp 2つの文字列持っている S秒と トントン等しい長さを持ちます。両方の文字列が小文字のラテン文字「で構成さ」と「B」。
Monocarpは、これら2つの文字列を作りたい の sおよび トントン互いに等しいです。インデックスを選択します。彼は、次の操作を何度でも行うことができます のP O S 1列でPOS1 秒秒、インデックス選択 のP O S 2列にPOS2を トンスワップトン、および S P O S 1 spos1と T 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文字「」と「b」を。
それはこれらの文字列が等しいことは不可能である場合は、印刷 - 1を -1。
そうでなければ、最初の行の印刷に k個の K -オペレーションの最小数は、文字列を等しくするために必要。次のそれぞれにおける k個の文字列内のインデックス- K線は2つの整数を印刷 S文字列中のSおよびインデックス のT対応するスワップ動作で使用されるべきであるT。
4 ABAB 、AABB
2 3 3 3 2
1 B
-1
8 BabbのAABB abababaa
3 2 6 1 3 7 8
最初の例では、2つの操作は十分です。たとえば、第三の手紙入れ替えることができます 秒で3番目の文字で秒 トンのトン。そして、 S = S = " ABBB"、 T = T = " AAAB"。次いで、第三文字スワップ S Sと第二の文字 のT tは。両方 S Sと T T「に等しいABAB」。
第二の例では、2つの文字列が等しくすることは不可能です。
質問の意味:あなたに2つの文字列が、少なくともこれら2つの文字列が等しい交換、および出力スイッチング方式ことができる回数を尋ねます
解決方法:2種類のbの文字のみがされているので、それが等しくない場合にのみ2例
1、
A
B
2、
B
A
それぞれ、両方のケースで出現統計の数は、K1で、k2は表し
K1、K2が奇数番号を有する場合、偶数、すなわち、(K1 + K2)%2 == 1は、2つの文字列を交換することは不可能である、-1出力等しいです
そうでない場合は、交換の同じ不等組の場合をさせ、K1 / 2 + K2 / 2の交換の数
最後に決定K1、K2の両方奇数かどうか、そしてもしそうであれば、唯一のセットとして、最後はに等しくありません
B
B A
2つの文字列が等しい作るために二回切り替えるべき
------------ 1
B B
A
------------ 2
B A
B A
------------
#include <iostreamの> する#include <アルゴリズム> の#include <CStringの> する#include <math.h>の 書式#include <スタック> の#include < 文字列・H> の#include < ストリング > の#include <ベクトル> の#define LL長い長い 使用 名前空間ははstd; int型の POS1 [ 200005 ]、POS2 [ 200005 ]。 int型のmain() { ストリングS1、S2。 int型T; cinを >> トン。 cinを >> S1;>> S2; INT K1 = 0、K2 = 0 ; のための(INT I = 0 ; I <T、I ++ ) { IF(!S1 [I] = S2 [I] && S1 [I] == ' A ' ) POS1 【K1 ++] = I + 1 ; // から出力インデックス開始 IF(S1 [I] = S2 [I] && S1 [I] ==!' B ' ) POS2 [K2 ++] = I + 1 。 } IF((K1 + K2)%2 == 1)// K1、K2は、奇数、偶数である COUT << -1 << ENDL; 他 { int型 CNT = K1 / 2 + K2 / 2 ; IF(K1%2 == 1 && K2%2 == 1)// K1、K2最後奇数回交換する時間を切り替える場合 、CNTをCNT + = 2 ; COUT << CNT << ENDL; INT I、J; のため(私は= 0 ; I + 1。 <K1、IはI + = 2 ) COUT << POS1 [I] << ' ' << POS1 [I +を1。 ] << ENDL。 用(J = 0 ; J + 1 <K2、J = J + 2 ) COUT << POS2 [J] << ' ' << POS2 [J + 1 ] << ENDL。 もし(I = K1 && J = K2!)// 处理最后一次交换下标 { COUT << POS1 [k1- 1 ] << ' ' << POS1 [k1- 1 ] << ENDL。 COUT << POS1 [k1- 1 ] << ' ' << POS2 [k2- 1 ] << ENDL。 } } 戻り 0 。 }