Trie: 高效存储和查找字符串
链表,Trie,堆关系
存储
从前往后遍历字符
每个单词的最后打上标记,以知晓该点是否有单词
int son[N][26]; // 其中存放的是:子节点对应的idx。其中son数组的第一维是:父节点对应的idx,第二维计数是:其直接子节点('a' - '0')的值
int cnt [N]; // 以“abc”字符串为例,最后一个字符---‘c’对应的idx作为cnt数组的下标。数组的值是该idx对应的个数。
int idx; // 将该字符串分配的一个树结构中,以下标来记录每一个字符的位置。(上图的☆)方便之后的插入和查找。
查找
依次查找字符串里的字符是否存在。如果全部匹配,输出
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
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];//移动到子节点的idx
}
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;
cin >> n;
char op;
while (n -- )
{
cin >> op >> str;
if (op == 'I')
{
insert(str);
}
if (op == 'Q')
{
cout << query(str) << endl;
}
}
}