まず、少なくとも一つの解、証明するための誘導を検討
まず明らかに$ 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 ; }