Codeforces 1178E。考古学

ポータル

まず、少なくとも一つの解、証明するための誘導を検討

まず明らかに$ N $ 3 <=

検討$ N = 4 $時間、それ以降$ S [1]!= S [2]、S [3]!= S [4] $、および$ S [I] \ {A、B、C} $で明らかにそれは、鳩の巣原理の$ S [1]、S [2]少なくとも$ S [3] $または$ S [4] $に等しい$手段

その後、我々はそれぞれの場所は、2〜4箇所の貢献が文字を回文になりますように、それは可解しなければならない、左と2の適切な組み合わせで各2、真ん中から両側に延長します

$ 4 = 3は、その後、我々は奇数に長さを回文時に最初の中間を選択します(右に2個ずつ作ることができない場合、MOD 4 = 2 $ \ $ nまたは最終的にいくつかのままにして残されるのmod \ $ nは注意してください)回文中心として

#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <ベクトル>
 使用して 名前空間STD。
typedefの長い 長いLL。
インラインint型リード()
{ 
    int型のx = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - '1 ; CH = GETCHAR()。}
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。}
     戻りのx *のF。
} 
のconst  int型 N = 2E6 + 7 int型のn;
チャーS [N]。
ベクトル < int型 > ANS;
ボイドワーク(int型 L、INT R)
{ 
    ため(; L> = 2 && R <= N- 1; 1- = 2、R + = 2 
    { 
        ベクトル < INT > CNT [ 3 ]。
        CNT [S [L - 1 ] - ' ' ] .push_back(1- 1 )。
        CNT [S [R + 1 ] - ' ' ] .push_back(R + 1 )。
        CNT [S [L] - ' ' ] .push_back(L)。
        CNT [S [R] - ' ' ] .push_back(R)
        int型のk = 0; K < 3 ; kは++ 場合(CNT [K] .size()> 1 
            { 
                ans.push_back(CNT [K] [ 0 ])、
                ans.push_back(CNT [K] [ 1 ])。
                破ります; 
            } 
    } 
} 
int型のmain()
{ 
    scanf関数(" %sの"、S + 1)。N = STRLEN(S + 1 )。
    int型半ば= 1 + N >> 1 もし(N%4){ans.push_back(MID)。仕事(半ば1、ミッド+ 1 ); }
     他の仕事(MID、ミッド+ 1 )。
    ソート(ans.begin()、ans.end()); 
    (オートP:ANS)のprintf(" %のC " 、S [P])。
    プット(""); リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11612640.html