字典樹板子

2022-07-24 06:12:10 字數 1177 閱讀 5567

基本的操作

next是表示每層有多少種類的數,如果只是小寫字母,則26即可,若改為大小寫字母,則是52,若再加上數字,則是62了,這裡根據題意來確定。

cnt可以表示乙個字典樹到此有多少相同字首的數目,這裡根據需要應當學會自由變化。

1

struct

node

8 };

view code

構建trie樹的基本演算法也很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則

建立對應的節點和邊。比如要插入單詞add(已經插入了單詞「ad」),就有下面幾步:

考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。

考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad

考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。

1"

code

"class="

cpp">void buildtrie(char *s)

10 p = p->next[s[i]-'a'

];

11 p->cnt++;

12}

13 }

view code

1)每次從根結點開始進行搜尋;

(4)迭代剛才過程。。。

(5)直到在某個結點處:

1

void findtrie(char *s)

9 p = p->next[s[i]-'a'

]; 10}

11 printf("

%d\n

",p->cnt);

12 }

view code

有些題目,資料比較大,需要查詢完之後釋放記憶體(比如:hdu1671 phone list)

1

void del(node *root)

view code

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...