IT评测·应用市场-qidao123.com技术社区

标题: Acwing Trie树 [打印本页]

作者: 用多少眼泪才能让你相信    时间: 2024-9-18 19:49
标题: Acwing Trie树
Trie树(字典树)

告急用途:是用来高效存储和查找字符串集合的一种数据布局。查找时,可以高效的查找某个字符串是否在Trie树中出现过,并且可以查找出现了多少次
使用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比力,查询效率比哈希树高。
图示如下:

告急性子:

Acwing 835 Trie字符串统计
   维护一个字符串集合,支持两种操作:
I x 向集合中插入一个字符串 x;
Q x 询问一个字符串在集合中出现了多少次。
共有 N个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。
  

输入样例
   5
I abc
Q abc
Q ab
I ab
Q ab
  输出样例:
   1
0
1
  实现思绪:

具体代码:
  1. #include <iostream>
  2. using namespace std;
  3. const int N=100010;
  4. char str[N];
  5. //son[][]存储树中每个节点的子节点
  6. //cnt[]存储以每个节点结尾的单词数量
  7. //idx表示当前用到了哪个下标
  8. //0号点既是根节点,又是空节点
  9. //插入一个字符串
  10. int son[N][26],cnt[N],idx;
  11. void insert(char str[]){
  12.     int p = 0;//树的指针,用于下移,初始指向根节点 根节点不存储字符
  13.     for(int i=0;str[i];i ++){
  14.         int u = str[i] - 'a';//u代表当前节点的某个子节点,映射为数字0~25
  15.         if(!son[p][u]) son[p][u] = ++ idx;//如果当前点不存在对应的字母,创建出来
  16.         //son[p][u]不为0代表p结点下连接着下标为u的字母
  17.         p=son[p][u];//指针下移
  18.     }
  19.     cnt[p] ++;//以p结尾的单词数量
  20. }
  21. int query(char str[]){
  22.     int p = 0;//开始为根节点
  23.     for(int i=0;str[i];i++){
  24.         int u = str[i]-'a';
  25.         if(!son[p][u]) return 0;//某个字符不存在直接退出
  26.         p = son[p][u];
  27.     }
  28.     return cnt[p];//以p结尾的单词数量
  29. }
  30. int main(){
  31.     int n;
  32.     cin >> n;
  33.     while(n--){
  34.         char op;
  35.         cin >> op >> str;
  36.         if(op == 'I') insert(str);
  37.         else cout << query(str) << endl ;
  38.     }
  39.    
  40.     return 0;
  41. }
复制代码
以上就是Trie树实现对字符串的统计应用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4