hdu1251-> 统计难题(Trie树入门题)

本文介绍了一种称为字典树的数据结构,也被称为Trie树。它是一种用于高效存储和检索字符串的树形结构。文章详细展示了如何使用C++实现字典树的基本操作,包括插入和搜索字符串,并解释了其在文本词频统计等场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门hdu-1251统计难题

基本的字典树,字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。


如上图所示,每一个红色节点都一个单词,白色节点表示公共前缀

#include <bits/stdc++.h>
using  namespace  std;

const int maxnode=1e6+5;
const int sigma_size=26;
struct Trie{
  int ch[maxnode][sigma_size];
  int sz;
  int num[maxnode];
  Trie(){
    sz=1;
    memset(ch[0],0,sizeof(ch[0]));
    memset(num,0,sizeof(num));
  }
  int  idx(char c){ return c-'a';}

  //插入字符串s,附加信息为v
  void insert(char *s, int v){
    int u=0,n=strlen(s);
    for(int i=0; i<n; i++){
      int c=idx(s[i]);
      if(!ch[u][c]){   //结点不存在
        memset(ch[sz],0,sizeof(ch[sz]));
        num[sz]=0;
        ch[u][c]=sz++;//新建结点
      }
      u=ch[u][c];//往下走
      num[u]++;
    }
  }

  int  search(char *s){
    int n=strlen(s);
    int u=0;
    for(int i=0; i<n; i++){
      int c=idx(s[i]);
      if(!ch[u][c])return 0;

      u=ch[u][c];
    }
    return num[u];
  }

};
Trie  T;
int  main(){
  char  s[15];
  int flag=0;
  while(gets(s),strcmp(s,"")){
    T.insert(s,1);
  }
  while(gets(s)!=NULL){
    printf("%d\n",T.search(s));
  }
  return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值