[] NikitoshトライとXOR LOJ#1 10051 "NikitoshとXOR" 2.3例3スルー」(トライ

[参考]ブログ:

LOJ番号の10051 "NikitoshとXOR(トライ" 〜3 2.3例」

 

[リンク]タイトル:

https://loj.ac/problem/10051

 

[タイトル]に意図されています。

二つの値が追加されている検索または排他ばらばらの間隔。

 

[ソリューション]タイトル:

このトピックでは、それは単にテンプレートのセットではない、非常に興味深いです。

サブジェクトフィールドと最大の問題は似ています。

まず、プレフィックスとXORすべてを事前にすることができます。

XOR間隔値は、排他的OR 2つのエンドポイントの接頭辞とXORです。

また、対処する必要があります

L [T] =最大{Xorの[I、J]} 1 <= I、J <= T 

R [T] =最大{Xorの[I、J]} T <= I、J <= N  

排他的論理和の最大のエンドポイントを表し、
質問は、どのようにそれ以上の2つの配列の値を知っていますか?
実際に、私たちはここの周りに少し作業を必要とする、我々は実際に、実際には、接頭辞とXORのエンドポイントを排他的範囲または値を求めます。
我々はすべてのプレフィックスを入れて、数字の一部としてならば、XOR値を最大化。木の01ほとんどの辞書の先頭に戻りますか?
しかし、我々はまた、最大のプロセスを保持する必要があります。
即L [I] =最大{L [I-1]、Insert_Xor(和[I])} 
現在の値を挿入することが、前のポイントの最大値よりもまだ小さいです。だから、波に対処します。
すぐに最大のフィールドのほとんどのように上記のプロセスとのですか?
 
 
[コード]:
書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
CONSTの INT N = 4E5 + 10 const  int型 M = 1E7 + 3E6; 

typedefの長い 長いLL。
int型の息子[M] [ 2 ]。
int型のバック合計[N]、[N];
INT [N]、N、IDX。
LLのL [N]、R [N]。

ボイド挿入(INT X){
     int型、P = 0 以下のためにint型 I = 30 ;〜Iを; i-- ){
        int型、T = X >> I&1 ;
        もし息子[P] [T] = ++(息子[P] [T]!)IDX。
        P = ソン[P] [T]。
    } 
} 

LLクエリ(INT X){
     int型 RES = 0、P = 0 以下のためにint型 I = 30 ;〜I; i-- ){
         int型 T = X >> I&1 もし(SON [P] [T ^ 1 ]){ 
            RES + = 1 << I。
            P =ソン[P] [T ^ 1]; 
        } { 
            P = ソン[P] [T]。
        } 
    } 
    戻りRES。
} 

int型のmain()
{ 
    scanf関数(" %のD "、&N)
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。

    (挿入0 );
    以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        和[i]は =和[I- 1 ] ^ [i]は、
        (合計[I])を挿入します。
        L [I] = MAX(L [I- 1 ]、クエリ(和[I]))。
    } 

    のmemset(SON、0はsizeof 息子)。
    IDX = 0 ; 

    (挿入0 );
    以下のためにint型 I = N; I; i-- ){ 
        和[I] =和[I + 1 ] ^ [i]は、
        (合計[I])を挿入します。
        R [I] = MAX(R [I + 1 ]、クエリ(和[I]))。
    } 

    LL ANS = 0 int型 iは= 1、I ++; iが<= N。){ 
        ANS = MAX(ANS、L [I] + R [I + 1 ])。
    } 
    / * 
    {ため(iは++; iがn = <I = 1 INT)
        のprintf( "%dを、%のLLDを\ n"、I、L [I])。
    } 
    ため(INT I = N; I; I - ){ 
        のprintf( "%dを、%のLLDを\ n"、I、R [I])。
    } 
    / * 
    のprintf(" %のLLDを\ n " 、ANS)。
    リターン 0 ; 
}
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/Osea/p/11361503.html