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 根節點不包含字元,除根節點外每乙個節...