[参考]ブログ:
LOJ番号の10051 "NikitoshとXOR(トライ" 〜3 2.3例」
[リンク]タイトル:
[タイトル]に意図されています。
二つの値が追加されている検索または排他ばらばらの間隔。
[ソリューション]タイトル:
このトピックでは、それは単にテンプレートのセットではない、非常に興味深いです。
サブジェクトフィールドと最大の問題は似ています。
まず、プレフィックスと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 ; }