[模板] trie树 (字典树)
2024-10-08 22:43:07
本文基于https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html
#include<bits/stdc++.h>
using namespace std;
const int amn=1e5+;
int trie[amn][],tid;
bool isw[amn];
int sum[amn];
void init(){
memset(isw,,sizeof isw);
memset(trie,,sizeof trie);
memset(sum,,sizeof sum);
tid=; ///节点在整个树中的序号
}
void insert(char *s){ ///插入一个单词,如果想查询后缀就反向插入
int len=strlen(s),rt=;
for(int i=;i<len;i++){
int id=s[i]-'a'; ///看选择当前节点的哪个儿子
if(!trie[rt][id])
trie[rt][id]=++tid;
sum[rt]++; ///前缀统计
rt=trie[rt][id];
}
isw[rt]=; ///结尾单词标记
}
bool isword(char *s){ ///查询是否存在这个单词
int len=strlen(s),rt=;
for(int i=;i<len;i++){
int id=s[i]-'a';
if(!trie[rt][id])return ;
rt=trie[rt][id];
}
return isw[rt];
}
bool isprefix(char *s){ ///查询是否存在这个前缀
int len=strlen(s),rt=;
for(int i=;i<len;i++){
int id=s[i]-'a';
if(!trie[rt][id])return ;
rt=trie[rt][id];
}
return ;
}
int prefix_sum(char *s){///查询当前前缀出现的次数
int len=strlen(s),rt=;
for(int i=;i<len;i++){
int id=s[i]-'a';
if(!trie[rt][id])return ;
rt=trie[rt][id];
}
return sum[rt];
}
int main(){
init();
char *s="hello",*s1="he";
insert(s);
printf("isword:%d isprefix:%d prefix_sum:%d\n",isword(s),isprefix(s1),prefix_sum(s1));
}
最新文章
- MySQL NoInstall 配置
- Chrome必备的扩展
- Oracle RAC客户端tnsnames.ora相关配置及测试
- POJ1201 Intervals[差分约束系统]
- visio二次开发初始化问题
- jquery-ajax完整写法
- nginx作为负载均衡服务器——测试
- Xcode插件VVDocumenter Alcatraz KSImageNamed等安装
- RCNN 和SPPnet的对比
- CF_402D Upgrading Array 因式分解
- linux下Rtree的安装
- 解决phpstorm ftp自动保存文件问题
- ";《算法导论》之‘队列’";:队列的三种实现(静态数组、动态数组及指针)
- FatMouse&#39; Trade -HZNU寒假集训
- windows PHP 安装 redis 外加扩展
- Python 中关于Random的使用方法
- (二)校园信息通微信小程序从后台获取首页的数据笔记
- tensorflow(4)踩过的一些坑
- ORM版学员管理系统
- zepto的ready方法