这是一个用来高效存储与查找字符串集合的数据结构
注意要标记每个字符串的结尾
[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++]