Trie 入門例題彙總

2021-10-08 11:52:58 字數 3357 閱讀 6798

trie(字典樹)是一種實現字串快速檢索的多叉樹結構。trie的每個節點都擁有若干個字元指標,若在插入或檢索時掃瞄到乙個字元c,就沿著當前的節點的c字元指標,走向該指標指向的節點 。

trie結構一種典型的用空間換取時間的資料結構,其空間複雜度為o(nc),其中n代表節點的個數,c代表著字符集的大小。

一:對字串的處理

例題:字首統計

題意:給定n個字串,再給出m個詢問 每次詢問乙個字串t,問s1~sn中有多字串是他的字首

思路:插入字串的時候,沒插入完成就將以當前節點為結尾的字串數量++,再從頭到尾的詢問t字串即可。

#include

// trie 模板

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e6+7;

const

int n =

5e5+7;

char str[maxn]

;int t[n][26

],cnt[n]

,idx;

//cnt陣列儲存以當前節點為結尾的字串有幾個

void

insert

(char

*s) cnt[p]++;

//當前大小++

}int

query

(char

*s)return ans;

}int

main()

while

(m--

)return0;

}

poj3630

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

5e5+7;

string str[maxn]

;int trie[maxn][17

],idx,vis[maxn]

;bool

insert

(string s)

vis[p]=1

;return

false;}

bool

cmp(string a,string b)

intmain()

sort

(str+

1,str+

1+n,cmp)

;//for(int i = 1;i <= n;i ++) coutfor(

int i =

1;i <= n;i ++)}

if(flag)

puts

("no");

else

puts

("yes");

}return0;

}

二:trie不盡可以對字串進行操作,同時也可以操作整數,因為十進位制數們可以轉化為二進位制下的01字串因此 經常使用trie對整數的異或操作進行解決。

例題:最大異或和

題意:給定n個數,找出他們之間兩兩組合異或能得到的最大值。

思路:把每個數看做01二進位制串,用trie來儲存每個整數的01串。進行查詢的時候,想要異或和最大只需要,每一位對應的二進數盡可能的不同,因此查詢的時候,最好的解決方法就是走向與當前這一位值不相同的方向,如果不同的方向不存在,就走相同的方向。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e5+7;

const

int n =

5e5+7;

int trie[

31*maxn][2

],idx;

int a[maxn]

;// 這道題就說明 trie 不僅可以 操作字串 同時還可以對二進位制狀態下的01串進行操作

void

insert

(int x)

}int

search

(int x)

else

if(trie[p]

[ch]

)else

break;}

return sum;

}int

main()

int ans =0;

for(

int i =

1;i <= n;i ++

)printf

("%d\n"

,ans)

;return0;

}

hdu5536

這道題用到了trie的刪除操作

求給定n個數

求出三個互不相同的數使得(a[i]+a[j])^ a[k] 的值最大

因為這道題要求三個數不能相同因此需要在查詢前先把i和j從trie刪除,這個可以用乙個flag陣列標記完成,插入時++,刪除時–。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e3+

100;

int a[maxn]

;//因為要保證 三個數不能有相同的 因此這次要用到 trie樹的刪除結構

int trie[maxn*31]

[2],idx,val[maxn*31]

;//val陣列儲存存入的值

int flag[maxn*31]

;void

insert

(int x)

val[p]

= x;

}void

del(

int x)

//刪除操作 不同就是 查詢之前 先把 si,sj刪除 然後再查詢 查詢完後 再插入si,sj

}int

query

(int x)

return val[p]

^x;}

intmain()

int ans =0;

for(

int i =

1;i < n;i ++)}

printf

("%d\n"

,ans);}

return0;

}

Trie字典樹例題

前幾天做了個trie樹的題,正好記一下。首先先看乙個簡單題 acwing 143.最大異或對 題目 在給定的n個整數a1,a2 an中選出兩個進行 xor 異或 運算,得到的結果最大是多少?第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出乙個整數表示答案。1 n 105 0 a i 23 1...

Manacher例題問題彙總

本篇隨筆面向個人 本來以為回文串很簡單,但是沒有做對應的練習前下此定論為時過早。雖然例題中也沒有模板題 因為太簡短了 但是有必要預先打一遍。將原字串頭部插入 尾部插入 或 0,再將間隔中插入 包括 後和 前也要有 比如說如果原串為abc,則變換為 a b c 定義變數mx,p,r i 遍歷新字串。首...

Trie 樹基礎入門

又稱單詞查詢樹,trie 樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。1 根節點不包含字元,除根節點外每乙個節...