数回の交換に少なくとも01の文字列と等しいC.スワップ手紙

 

C.スワップレター

テストあたりの時間制限
2秒
テストごとのメモリ制限
256メガバイト
入力
標準入力
出力
標準出力

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、

   

  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 
}

 

おすすめ

転載: www.cnblogs.com/-citywall123/p/11919680.html
おすすめ