關於\(trie\)樹的詳細介紹,還請移步這篇深度好文
插入
void insert()
}
注意,其中\(tot=0\),我習慣\(p\)初始值也為\(0\)。\(tot\)與\(p\)初值應保持一致。
檢索操作非常靈活,各題不同,但是都很簡單,那麼就自己想吧=w=(不負責地逃離)。
簡單題1:luogu p3879 [tjoi2010]閱讀理解
在每個文章記錄一下出現次數即可。
#include#include#includeusing namespace std;
int n,m,l,p,tot=1;
int trie[500090][26];
bool b[500000][1100];
char word[25];
void insert(char *str,int opt)
endd[p]=1;
if(cnt[p]>1) flag=1;
}int main()
if(flag) printf("no\n");
else printf("yes\n");
memset(endd,0,sizeof(endd));
memset(trie,0,sizeof(trie));
memset(cnt,0,sizeof(cnt));
tot=0;
} return 0;
}
話說做這道題的時候開始用的陣列叫\(end\)然後\(compile\)
\(error\)了...虛的一批。
簡單題3:luogu p2580 於是他錯誤的點名開始了
非常符合字典樹的性質,直接上就行了。
#includeusing namespace std;
int n,m,tot,p;
int flag,end[1000090];
int trie[1000090][27];
char a[100];
void insert(char *str)
edge[200009];
queueq;
void add(int x,int y,int z)
void bfs()
}}int main()
bfs();
scanf("%d",&m);
for(int i=1;i<=m;i++)
return 0;
}
回到我們最開始的問題==!有了前面兩題的基礎,那麼我們在這個問題中要求的答案就等效於簡化問題,只是數列變成了\(d\)。
#include#includeusing namespace std;
int n,tot,ans;
int d[100090],head[100090],trie[100090*32][5];
struct nodeedge[200090];
void add(int x,int y,int z)
void dfs(int u,int fa)
}void insert(int x)
}int ask(int x)
return orz;
}int main()
dfs(1,0);tot=0;
for(int i=1;i<=n;i++) insert(d[i]);
for(int i=1;i<=n;i++) ans=max(ans,ask(d[i]));
printf("%d\n",ans);
return 0;
}
一定要注意\(qwq\)是\(bool\)型別的!這樣保證只有0或1。如果是\(int\)的話,就不保證了!!(\(warning\))
討論下開空間的問題吧!
本蒟蒻幾乎是做一道\(trie\)就\(re\)一次...(逃)
比較玄學...盡量開大一點好(逃)
trie樹學習總結(字典樹模板)
trie樹 演算法簡介 字典樹,也叫trie樹,是一種比較實用的資料結構,無論是在acm競賽的題目中,還是字串相關的某些實際應用領域內,它都能發揮巨大的作用。首先來看看字典樹的本質是什麼。它其實是一棵儲存了很多字串的樹,這棵樹上的每一條邊就是某個或某些字串中的乙個字元,而從根節點到某乙個特定節點所經...
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...