真珠のネックレスのビーズ

https://loj.ac/problem/2427

タイトル説明

  セグメントの異なる数までシーケンス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- 11)、f_hash(iは、iがK-+ 10を)); 
        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 ; 
}

 

おすすめ

転載: www.cnblogs.com/fangbozhen/p/11620768.html