trie樹的應用

2022-03-16 14:57:21 字數 1572 閱讀 1854

現有乙個 n 個點的完全圖,點編號為1 到 n。另給出乙個長度為n 的序列 ai​,完全圖中第 i 個點與第j 個點間的邊的邊權為 ai⊕aj,其中 ⊕ 表示按位異或運算。

請您找出該完全圖的最小生成鏈。由於答案可能很多,您只需輸出這條最小生成鏈中邊權最大的邊的邊權即可。

這道題可以想到乙個性質,就是在比較兩個數的大小時,如果前面位置的數相同,從第乙個不同的數開始比較,那麼位置大的數大的這個數就大;

就是從高位比較;

二進位制數也有這個性質;

這個題可以用最小生成樹來寫暴力(部分分),就是可以證明最小生成樹上最大的邊等於最小生成鏈上最大的邊;

我也不會證,我也不敢問;

貼個題解

證明:首先最小生成樹的最大邊一定不大於最小生成鏈的最大邊,

然後按照下文的做法分為 0,1 兩塊後,

中間這條邊就是最小生成鏈最大邊。

如果不連上這條邊,那麼 0的連通塊和 1的連通塊無法連通。

因此這條邊一定在最小生成樹中,也就是說最小生成樹的最大邊不小於最小生成鏈的最大邊。

於是就證明了兩種的最大邊相等。

就是在所有點的權值中,前面的位置數都相同,那麼異或後都是零,不用管;

從第乙個有0有1的位置開始(位置為i),可以把0分為一組,1分為一組;

0中連邊不會超過1<

那麼只缺這兩個連通塊中連一條邊了,這個邊就是最大邊;

我們希望這個交界的部分兩元素異或值最小。也就是說,我們需要從這一位為 00 的元素中和這一位為 11的元素中各找出乙個元素,使得這兩個元素的異或值最小。

接下來這個找最小值的過程可以進行優化。這裡有異或操作,很自然地能夠想到 0-1 trie。我們可以維護一棵 0-1 trie,我們將序列中所有這一位為 0的元素插入這棵 trie,然後用所有這一位為 1的元素去 trie 中查異或最小值。最後所有最小值的最小值就是答案了。

要注意特判一下所有元素都相同的情況,因為這會找不到這個最高的位滿足這一位上有 0和 1。

時間複雜度和空間複雜度都是 o(nlog⁡ai)。

#include#include

#include

using

namespace

std;

const

int maxn=1e6+100

;typedef

long

long

ll;ll trie[

3][maxn],cnt=1

;ll n,a[maxn];

ll maxl=-1

;ll ans=1e18;

void

insert(ll x)

}ll qmin(ll x)

}return

res;

}int

main()

sort(a+1,a+n+1

);

for(int i=59;i>=0;i--)

}if(maxl==-1

)

for(int i=1;i<=n;i++)

printf(

"%lld

",ans);

return0;

}

Trie樹及其應用

一,知識簡介 trie樹,又稱單詞查詢樹 鍵樹或字首樹。典型應用是用於排序和統計大量字串,但不僅限於於字串,所以經常被搜尋引擎用於文字詞頻統計。它的優點是 最大限度的減少無謂的字串比較,查詢效率比雜湊表高。字典樹的核心思想是以空間換時間,利用字串的公共字首來降低查詢時間開銷來達到提高效率的目的。tr...

字典(trie)樹的應用與實現

字典樹又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。常見的可以使用字典樹解決的問題舉例 ...

Trie樹 髒詞過濾應用

當前的 還只是進行簡單的替換,並沒有做一些字元的處理,比如 昨天見到你媽,逼我要買房 這本身不是髒詞,因為有逗號,所以程式裡要增加字元的範圍判斷。程式中的skip就是用來過濾髒詞的簡單變體,比如 找 小 姐 預設是最多跳過3個字元,這個可以隨便調整了。總之是乙個trie的鍛鍊吧。public cla...