数据结构——字典树
NO.1 定义#
字典树又称单词查找树,
它具体是什么样的呢?
它的点用来保存每一个节点编号,以及有无在此节点结束的字符串。
它的边用来保存字符。
从根节点到每一个子节点的路径上字符所组成的即为一个字符串。
NO.2 插入#
字典树共应用两个函数,插入和检索。
插入,顾名思义即为在字典树中插入一个字符串,从根节点出发,根据字符串上的每一个字符向下搜,如果指向空则另开边存储字符。
需要注意,我们需运用一个数组来记录此节点是否是一个字符串的末尾,不然无法判断在字典树上是否存在此字符串。
Code
void Insert(char *str){//将字符串以指针形式传入,操作时直接影响实参
int p=1,len=strlen(str);
for(int i=0;i<len;i++){
int ch=str[i]-'a';
int q=Trie[p][ch];
if(!q){//判断是否存在保存当前字符的边
Trie[p][ch]=q=++cnt;
}
p=q;
}
End[p]++;//保存结尾
}
NO.3 检索#
检索,指判断字典树中是否存在一个字符串。
依旧从根节点出发,根据字符串上的每一个字符向下搜,如果没有边对应字符串中的字符或搜到末尾没有标记,则说明没有此字符串在字典树中,反而有之。
Code
bool search(string s){//依旧传入字符串地址
int p=1,len=s.length();
for(int i=0;i<len;i++){
int ch=s[i]-'0';
p=Trie[p][ch];
if(!p){//判断有无此边
return 0;
}
}
return en[p];//判断此边是否是一个字符串结尾
}
NO.4 例题#
The XOR-longest Path#
题目描述#
给定一棵
输入格式#
第一行一个整数
输出格式#
输出一行一个整数,表示答案。
样例#
样例输入
4
1 2 3
2 3 4
2 4 6
样例输出
7
思路#
题目解释的很清楚,求树上一段路径的数异或的最大值。
因为
所以我们可求得根节点到每一节点异或值,设为
设要求的路径端点为
根据每两个端点的异或值的二进制数建字典树,因异或,每一数位的数字相反才为
Code
void Insert(ll x){
ll p=1;
for(int i=30;i>=0;i--){
ll ch=x>>i&1;
if(!Trie[p][ch]){
Trie[p][ch]=++cnt;
}
p=Trie[p][ch];
}
End[p]=1;
}
ll Search(ll x){
ll p=1,ans=0,de=30;
for(int i=30;i>=0;i--){
ll ch=x>>i&1;
if(Trie[p][!ch]){
ans|=(1<<i);
p=Trie[p][!ch];
}
else{
p=Trie[p][ch];
}
}
return ans;
}
Finally#
精简版总结
例题还可能会补充。。。
信仰不渝
Unswerving faith
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律