Trie ライブラリ
ポインタベースの Trie ライブラリ. ソース ポイント ポインタと new で実装.Trie という構造体がノードを表す. 実装上,ノードは増やすだけで,削除はしない. (template parameter で指定する) 3つのモードがある.これらのモードは,メンバ関数 insert / erase / search の振舞に影響する TRIE_SET_SINGLE … set に相当 TRIE_SET_MULTI … multiset に相当 TRIE_SET_NONE … どちらにも該当しない ノードに格納するユーザデータを定義できる (user というフィールドがある) 使用法 using MyTrie = Trie<26, 'a', TRIE_SET_SINGLE>; // 文字種類数,先頭文字,モード MyTrie* root = new MyTrie; // Trie の作成. MyTrie* p1 = root->insert("abcde"); // 挿入.必要なノードを作ると同時に,「要素」としても登録. MyTrie* p2 = root->search("abc"); // 要素ではないので p2 == nullptr MyTrie* p3 = root->search("abcde"); // 要素なので,p3 == p1 MyTrie* p4 = root->get_node("abc"); // 要素かどうかに関係なくノードを取る // ノードがないときには nullptr が返るが,この場合は,p4 == p2 になる. assert(p3->reside == 1); // p3が表す文字列は要素である. assert(p4->reside == 0); // p4が表す文字列は要素でない. root->insert("abab"); root->insert("abab"); // いまは SINGLE なので,何も起こらない assert(root->size_st == 2) // 部分木に存在する要素の数. p3->erase(); // 要素としての削除.葉であってもノードは削除しない. assert(p3->reside == 0); assert(p4->size_st == 1); // 文字列 s の全prefixを処理するループ // 長い方から: for (MyTrie* p = root->get_node(s); p; p = p->parent) // ....