这是一个用来高效存储与查找字符串集合的数据结构
注意要标记每个字符串的结尾

[Trie树] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<bit/stdc++.h>
using namespace std;
const ing N=100010;

int sun[N][26],cnt[N],idx;
//每一个节点最多26个边 子节点就设置26 cnt表示以当前这个点结尾的词有多少个 idx表示当前用到了哪个下标 下标为0 既是根节点 又是空节点

//插入
void insert(char str[])
{
int p=0;
for(int i=0;str[i];i++) //c++字符串结尾为/0
{
int u=str[i]-'a'; 将a-z映射为0-25
if(!son[p][u]) son[p][u]=++idx; //如果遍历到的该字母未出现过,开辟新空间存储该字母
p=son[p][u]; //无论之前有无此子节点 现在反正是有了 就移动过去
}
cnt[p]++; //每插入一次字符串,用cnt[p]将该单词出现的次数+1
}

//查询
int query(char str[])
{
int p=0;
for(int i=0;syr[i];i++)
{
int u=str[i]-'a';
if(!son[p][u]) return 0;
p=son[p][u];
}
return cnt[p];
}

[最大异或对] [c++]
1
2