Trie树
Trie树
- 字母的类型不会很多
开数组的时候str[maxn][26]
maxn是字符串长度,26是指每一层大概有几个位置
存储方法:
- a节点有没有存,没有就创建一个
- 在字母的结尾打一个标记表示有个单词
dijistra要用堆优化
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
char str[maxn];
int son[maxn][26], cnt[maxn], idx; // 下标是0的点,即是根节点,也是空节点
void insert(char str[])
{
int p = 0; // 根节点
for (int i = 0; str[i]; i ++)
{
int x = str[i] - 'a';
if(!son[p][x]) son[p][x] = ++ idx; // 不能是i,i是字符长度,只能得到高度不是树的坐标寻找。
p = son[p][x];
}
cnt[p] ++ ;
}
int query(char str[])
{
int p = 0; // 根节点
for (int i = 0; str[i]; i ++)
{
int x = str[i] - 'a';
if(!son[p][x]) return 0; // 不能是i,i是字符长度,只能得到高度不是树的坐标寻找。
p = son[p][x];
}
return cnt[p];
}
int main()
{
int n;
char op[2];
cin >> n;
while (n--)
{
scanf("%s %s", &op, &str);
if(op[0] == 'I') insert(str);
else printf("%d\n", query(str));
}
return 0;
}
有什么问题可以加qq:1281372141进行交流