基本的操作
next是表示每層有多少種類的數,如果只是小寫字母,則26即可,若改為大小寫字母,則是52,若再加上數字,則是62了,這裡根據題意來確定。
cnt可以表示乙個字典樹到此有多少相同字首的數目,這裡根據需要應當學會自由變化。
1view codestruct
node
8 };
構建trie樹的基本演算法也很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則
建立對應的節點和邊。比如要插入單詞add(已經插入了單詞「ad」),就有下面幾步:
考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。
考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad
考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。
1"view codecode
"class="
cpp">void buildtrie(char *s)
10 p = p->next[s[i]-'a'
];
11 p->cnt++;
12}
13 }
1)每次從根結點開始進行搜尋;
(4)迭代剛才過程。。。
(5)直到在某個結點處:
1view codevoid findtrie(char *s)
9 p = p->next[s[i]-'a'
]; 10}
11 printf("
%d\n
",p->cnt);
12 }
有些題目,資料比較大,需要查詢完之後釋放記憶體(比如:hdu1671 phone list)
1view codevoid del(node *root)
1.用g++交會出現memory limit exceeded(就算釋放了記憶體,還是memory limit exceeded)
2.根結點要初始化root=new node;
HDU1251 字典樹板子題
題意 中文題,統計以某字串作為字首的字串個數 剛學字典樹,理解起來十分簡單,就是維護乙個多叉樹,這裡用的是鍊錶版本,後面就用的是陣列版本了,個人更喜歡陣列版本,這裡的鍊錶版本就因為 莫名其妙的錯誤 c 能過而g 就會mle 可能是兩者管理記憶體的方式不一樣吧 1 include2 include3 ...
劃分樹板子
include include include define n 100010 using namespace std typedef long long ll int a n 原陣列 int sorted n 排序好的陣列 是一棵樹,但把同一層的放在乙個陣列裡。int num 20 n num i...
樹的直徑 板子
不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...