当前位置:网站首页>Trie思想及模板
Trie思想及模板
2022-08-03 17:14:00 【lcy2023】
参考博文:https://www.acwing.com/solution/content/14695/
课程链接:https://www.acwing.com/video/260/
例题链接:https://www.acwing.com/problem/content/837/
思想
用于高效的存储和查找字符串集合的数据结构,用Trie树的字符串一般要么是小写字母要么都是大写字母,类型不会多,字符串的长度也不会太长
root为空节点,图中五角星的意思是标记有以该字母结尾的字符串,代码表示是cnt数组,记录以该字母结尾的字符串的数量
例题
该题目中都为26个字母,所以可以开辟son[][26]数组,来映射26个字母,该数组表示的是子节点,用son[]某节点的所有子节点,son[]列映射为子节点的值,son[][]的值表示该节点是第几个加入的不重复的节点。cnt[]数组标识字符串的结束,idx用来确定节点是否存在
代码
#include <iostream>
using namespace std;
const int N = 100010;
int son[N][26], cnt[N], idx;
char str[N];
void insert(char *str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p] ++ ;
}
int query(char *str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
}
int main()
{
int n;
scanf("%d", &n);
while (n -- )
{
// 此处设置成op[2],而不是char op,是因为char op用scanf("%c")会读入一些空格或回车
// 而char op[2]用scanf("%s")会忽略空格和回车
char op[2];
scanf("%s%s", op, str);
if (*op == 'I') insert(str);
else printf("%d\n", query(str));
}
return 0;
}
边栏推荐
猜你喜欢
随机推荐
C# 获取文件名和扩展名(后缀名)
组件通信-父传子组件通信
工程仪器设备在线监测管理系统常见问题和注意事项
vant自动上传图片/文件
被误解的 MVC 和被神化的 MVVM(一)
TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践
Big guys.Use flink-cdc-sqlserver version 2.2.0 to read sqlserver2008R
PMP考试通关宝典-敏捷专题
401. Binary Watch
新“妖股”13个交易日暴涨320倍,市值3100亿美元超阿里
华为、联想、北汽等入选工信部“企业数字化转型和安全能力提升”首批实训基地
并发高的情况下,试试用ThreadLocalRandom来生成随机数
工程仪器设备在线监测管理系统常见问题和注意事项
C# 构造函数如人之影子
ICDAR比赛技术分享
A complete detailed tutorial on building intranet penetration ngrok (with pictures and truth)
怎么在opengauss中进行测试自己添加的新函数的性能(循环n次的运行时间)?
LeetCode·72.编辑距离·动态规划
J9数字虚拟论:元宇宙的潜力:一股推动社会进步的力量
为何微博又双叒叕崩溃了?