字典樹及其應用

2022-03-11 21:42:19 字數 1700 閱讀 9559

字典樹是一種比較特殊的樹,邊上有邊權(至少我是怎麼理解的)。又名「trie」樹。

大概長這樣:

(插入了cap,cat,csp,co,code)

邊上是字符集,點上是點的編號,塗成藍色的代表是單詞的結尾。

字符集可以是a-z0-9true和false等等。

字典樹有效的組織了單詞的關係,節省了時間和空間。

void insert(char *s) 

isend[p] = true;

}

這裡trie[x][c]表示從節點xc這條邊能達到節點trie[x][c]

其中,m為節點總數計數,要在插入前賦初始值為\(1\) 。

這裡isend用於標記是否是結尾,有時還需要記錄次數。

每道題都有他查詢的內容,需要因地制宜的寫查詢函式。

查詢字首是否出現:

bool query(char *s) 

return true;

}

查詢出現次數(注意配套修改insert函式):

int query(char *s) 

return isend[p];

}

本文主要談應用字典樹解題,如果上面的講解不明白,可以自行baidu一下qwq。

檢視原題-洛谷p2580

這題是字典樹最基本的運用,查詢存在性和重複性。

把所有化學生的姓名插入字典樹,再在每次教練點名時,查詢。

檢視原題-libreoj#10050

這題看似和字典樹沒啥關係,也找不到可以插入的字串。

最容易想到的做法就是暴力,兩兩枚舉xor,時間複雜度 \(o(n^2)\) 。

其實這裡可以把每個數的二進位制值插入字典樹中,

列舉每個數,在字典樹中查詢與它盡量二進位制按位盡量相反的樹。

code:

void insert(int x) 

isend[p] = true;

}int lookup(int x) else

}return res;

}

檢視題目-暫無題目qwq

描述:還是給你乙個序列,要求這個序列的某個子串行的異或和最大,求這個最大值。

(注:子串行是連續的,子串才是不連續的。

異或和是指連續異或的值,如4,7,10的異或和是4 xor 7 xor 10

這裡要用到異或的幾個性質:

\(a \operatorname b \operatorname c=(a \operatorname b)\operatorname c=a\operatorname(b\operatornamec)\)

\(a \operatorname a=0\)

\(a\operatorname0=a\)

字典樹應用

trie,又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。相對來說,trie樹是一種比較簡單的資料結構.理解起來比較簡單,正所謂簡單的東西也得付出代價.故trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹...

字典樹及其C 實現

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

字典樹的應用

論吹牛,學弟一點也不輸個學長。為了找到自己的存在感,學弟又和學長在比誰前女友多,於是2個人撕逼開始了,學弟說我在大一的時候談了a個女朋友,學長說那是我乙個星期的 數量,我大一的時候談了ab個女朋友,學弟又說加上高中的我談了abc個女友,學長再次 不服,加上高中我談了abcdf個女朋友 想必大家已經明...