Trie字典樹例題

2021-10-21 14:08:37 字數 2521 閱讀 1842

前幾天做了個trie樹的題,正好記一下。

首先先看乙個簡單題

acwing 143. 最大異或對

題目

在給定的n個整數a1,a2……an中選出兩個進行 xor(異或)運算,得到的結果最大是多少?

第一行輸入乙個整數n。

第二行輸入n個整數a1~an。

輸出乙個整數表示答案。

1 ≤n

≤105

,0≤a

i<23

11≤n≤10^5, 0≤a_i<2^31

1≤n≤10

5,0≤

ai​<23

1 solution

這個題看資料範圍應該是o(nlogn)級別內的,先看暴力做法就是列舉ai和aj,這樣是o(n^2)的,妥妥的tle。然後看第一維ai肯定要保留,只有優化第二維aj了。

要求兩個數異或最大,肯定要越高位越大越好,根據這個貪心的思想,就可以套上trie了(生硬)。

這裡的son陣列:son[s][0/1]表示s層0/1結點的子結點在son陣列中的下標。

/**

* acwing 143. 最大異或對

* */#include

using

namespace std;

const

int n =

100010

, m =

3000000

;int n, a[n]

;int son[m][2

], idx;

void

insert

(int x)

}int

query

(int x)

else p = son[p]

[b];

}return res;

}int

main()

int ans =0;

for(

int i =

1; i <= n;

++i)

ans =

max(ans,

query

(a[i]))

; cout << ans << endl;

return0;

}

1414. 牛異或

稍難點的題,多了乙個字首和的點。

題目

農夫約翰在給他的奶牛們餵食時遇到了乙個問題。

他共有 n 頭奶牛,編號 1∼n。

每次餵食前,這 n 頭奶牛會按照 1∼n 的順序站成一排。

此外,每頭奶牛都被分配了乙個可能不唯一的整數。

那麼所有被分配的整數就形成了乙個長度為 n 的整數序列。

請你在該整數序列中找出乙個連續的非空子序列,使得子串行中元素的異或和能夠最大。

如果存在多個這樣的序列,那麼選擇序列末端整數對應的奶牛編號更小的那個序列。

如果仍然存在多個可選的序列,那麼選擇長度最短的那個序列。

第一行包含整數 n。

第 2∼n+1 行,每行包含乙個整數,其中第 i 行的整數表示編號為 i−1 的牛被分配的整數值。

輸出三個整數,分別表示最大的異或和,所選序列首端整數對應的奶牛編號,所選序列末端整數對應的奶牛編號。

1 ≤n

≤105

1≤n≤10^5

1≤n≤10

5,分配給奶牛的整數的範圍是 [0,

221−1

][0,2^−1]

[0,221

−1]。

solution

跟上面一題一樣還是套trie,不過要保證題目對左右端點的要求,我們可以列舉ai,然後在a[1]~a[i-1]構成的trie樹中尋找。

#include

using

namespace std;

const

int n =

100010

, m = n *21;

int n, sum[n]

;int son[m][2

], idx, id[m]

;// trie 字典樹

void

insert

(int x,

int k)

id[p]

= k;

}int

query

(int x)

return id[p];}

intmain()

int ans =-1

, l, r;

insert(0

,0);

for(

int i =

1; i <= n;

++i)

insert

(sum[i]

, i);}

cout << ans <<

" "<< l <<

" "<< r << endl;

return0;

}

Trie樹(字典樹)

trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...

字典樹 trie樹

amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...