字典樹(Trie)
Trie 是一種能夠快速插入和查詢字串的多叉樹結構。
節點的編號各不相同,根節點編號為 \(0\) ,其他節點用來標識路徑。
還可以標記單詞插入的次數。邊表示字元。
一般情況下,Trie維護字串的集合,支援以下兩種操作:
1.向集合中插入一個字串。
2.向集合中查詢一個字串。
建字典樹
子陣列 ch[p][j]
表示從節點 \(p\) 沿著 \(j\) 這條邊走的到子節點。
計數陣列 cnt[p]
表示以節點 \(p\) 結尾得到單詞的插入次數。
節點編號 idx
用來給節點編號。
1.Trie中只有一個根節點,編號為0。
2.從根開始插入,列舉字串的所有字元。
如果有兒子,那麼直接走到兒子。
反之,先建立兒子,再走到兒子。
3.維護計數陣列。
int ch[N][26],cnt[N],idx;
void insert(string s){
int p=0;
for(auto c:s){
int j=c-'a';
if(!ch[p][j]) ch[p][j]=++idx;
p=ch[p][j];
}
cnt[p]++;
}
int query(string s){
int p=0;
for(auto c:s){
int j=c-'a';
if(!ch[p][j]) return 0;
p=ch[p][j];
}
return cnt[p];
}