字典樹是一種比較特殊的樹,邊上有邊權(至少我是怎麼理解的)。又名「trie」樹。
大概長這樣:
(插入了cap,cat,csp,co,code)
邊上是字符集,點上是點的編號,塗成藍色的代表是單詞的結尾。
字符集可以是a-z
,0-9
,true和false
等等。
字典樹有效的組織了單詞的關係,節省了時間和空間。
void insert(char *s)
isend[p] = true;
}
這裡trie[x][c]
表示從節點x
由c
這條邊能達到節點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個女朋友 想必大家已經明...