タイトル説明
セグメントの異なる数までシーケンスk個のセグメントにK(いない最後の段落丸め複数)を作成しようとしている、配列Aを与えます。そして、文字列の反転自体と同じ。
考え
この質問の長さが大きくはない、我々は、暴力kを列挙し、各kについて異なる文字列の数をカウントして、答えを更新することができます。これは倍の長たちは、正と負のハッシュ値を扱うように、その反転が関係する二だけに、関係なく、そのための文字列を言っていないことに注意してください。しかし、少しカードシングルハッシュは、好ましくは二ハッシュで、私は怠け者だ、この質問はチューンに、bの曲を書くこと。
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの符号なしの長い 長いULL。 constの ULLのP = 10000019 ; CONST ULL MAXN = 2E5 + 10 。 ULL SUM1 [MAXN]、SUM2 [MAXN]、パワー[MAXN]、[MAXN]、[MAXN] ANS、N。 ULL f_hash(ULLのL、R ULL、ブールF) { 場合(F)戻り SUM1 [R] -sum1 1- [ 1 ] *電力[R-L + 1 ]。 他 戻り SUM2 [L] -sum2 [R + 1 ] *電力[R-L + 1 ]。 } 集合 <ULL> S。 ULL CAL(int型K) { s.clear()。 用(int型 I = 1 ; I + K- 1 ; <= N I + = K) { ULL TMP =分(f_hash(I、I + K- 1、1)、f_hash(iは、iがK-+ 1、0を)); s.insert(TMP)。 } 戻りs.size()。 } int型のmain() { scanf関数(" %のLLU "、&N) 用(ULL i = 1 ; iが<= N; iが++ ) のscanf(" %のLLU "、&[I])。 電力[ 0 ] = 1 ; 用(ULL i = 1 ; iが<= N iが++ ) { SUM1 [I] = SUM1 [I- 1 ] * P + [I]。 電源[I] =電力[I- 1 ] * P。 } ため(ULL I = N; I> = 1 ; i-- ) SUM2 [I] = SUM2 [I + 1 ] * P + [I]。 // (; iが<= N I ++はULL I = 1)のための // のprintf( "%のLLUの%のLLUする\ n"、SUM1 [i]は、SUM2 [I])。 ULL MAXX = 0、CNT = 0 。 ため(ULL i = 1 ; iが++; iが<= N ) { ULL今 = CAL(i)を、 もし(現在> MAXX) { MAXX = 今。 CNT = 0 ; } であれば(MAXX == 今) ANS [ ++ CNT] = I。 } のprintf(" %のLLU%のLLUする\ n " 、MAXX、CNT)。 用(int型 i = 1 ; iが= CNTを<Iは++ ) のprintf(" %のLLU "、ANS [I])。 リターン 0 ; }