左神演算法筆記(九) 字首樹擴充

2021-10-02 16:46:38 字數 1322 閱讀 1010

給定乙個陣列,求子陣列的最大異或和。乙個陣列的異或和為陣列中所有的數異或起來的結果。

之前做個乙個找到異或和為0的最長子陣列,思路是將每乙個節點當做異或和的最後乙個節點,求解最長的子陣列。同樣這個題目可以以這種方法解決。以i位置結尾的最大異或和的值,最大的異或和一定包含在其中。

暴力解法就是從0-i,1-i,2-i。。。進行遍歷,求解出以i為末尾的最大異或和的值,不斷遍歷,求出最後的結果。

精簡思路:

準備輔助陣列dp,每乙個位置在算完之後結果都儲存在陣列中,將當前arr【i】和0-start-1的異或結果異或,此時可以少一遍迴圈,就可以計算出start到i的異或結果。

字首樹思路:

將每一次從0到i異或的結果的二進位制序列扔到字首樹中,形成一顆字首樹,當新的i出現,此時希望將異或結果求最大,則首位還是希望為0,此時符號位為正數。

首位確定好之後,則下面的路希望盡量選1,此時數值盡量大,所以資料位需要與0-i異或結果盡量相反,求解最大。

其實字首樹思路是在第二種思路上進行的改進,利用兩個前k項異或求出最大的異或結果

暴力解**

public

static

intgetmaxe

(int

arr)

max = math.

max(max,res);}

}return max;

}

public

static

intgetmaxe2

(int

arr)

dp[i]

= eor;

}return max;

字首樹:

public

static

class

node

public

static

class

numtrie

}public

intmaxxor

(int num)

return res;}}

public

static

intmaxxorsubarray

(int

arr)

int max = integer.min_value;

int eor =0;

numtrie numtrie =

newnumtrie()

;//此時為乙個黑盒

numtrie.

add(0)

;for

(int i =

0; i)return max;

}

左神演算法初級班筆記6 字首樹 貪心

arr2中有哪些字元,是作為arr1中某個字串字首出現的?請 列印 arr2中有哪些字元,是作為arr1中某個字串字首出現的?請列印 arr2 現次數最大的字首。不要企圖證明貪心的正確性,想幾個貪心策略之後,用對數器去證明正確的即可。1.按最低字典序拼接字串給定乙個字串型別的陣列strs,找到一種拼...

左神演算法講堂筆記 05 樹

非遞迴遍歷有點難,目前只能讀懂 裡面的精髓還未真正參透。先序遍歷 不斷地把根入棧,再取出來輸出 根左右,那麼先入棧的肯定是根,要保證輸出左子樹,再輸出右子樹,那麼就要先入棧右子樹。void preorderunrecur node head if node.left null 中序遍歷 必須左子樹走...

左神演算法筆記01

對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...