HDU 1251 字典树(前缀树)

本文介绍了一种用于统计单词中特定字符串前缀数量的算法。该算法通过构建字典树来高效地完成任务,首先将所有单词插入到字典树中,然后查询每个指定前缀在树中的出现次数。

题目大意 :Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).(单词互不相同)

代码:

  #include<iostream>
  #include<cstdio>
  #include<cstdlib>
  #include<cstring>
  #include<queue>
  #include<algorithm>
  #include<cmath>
  #include<map>
  using namespace std;
  #define INF 0x7fffffff

  int ch[1000000][30],isword[1000000];
  int num[1000000],nz;

  void insert(char s[],int len){
      int i,j,u = 0;
      num[u]++;
      for(i=0;i<len;i++){
          int v = s[i] - 'a' ;
          if(!ch[u][v]){
              memset(ch[nz],0,sizeof(ch[nz]));
              isword[nz] = 0;
              ch[u][v] = nz ++ ;
          }
          u = ch[u][v] ;
          num[u]++;
      }
      isword[u] = 1;
  }

  int query(char s[]){
      int i,j,len,u = 0;
      len = strlen(s);
      for(i=0;i<len;i++){
              int v = s[i] - 'a';
          if(!ch[u][v]){
                return 0; 
          }
          u = ch[u][v];
      }
      return num[u];
  }

  int main(){
      int i,len;
      char s[12],c;
      nz = 1;
      memset(num,0,sizeof(num));
      memset(ch[0],0,sizeof(ch[0]));
      c = getchar();
      while(c != '\n'){
          gets(s+1);
          s[0] = c ;
          len = strlen(s);
          s[len] = '\0' ;
          insert(s,len);
          c = getchar();
      }

      while(scanf("%s",s) == 1){
          int ans = query(s);
          printf("%d\n",ans);
      }
      return 0;
  }

转载于:https://www.cnblogs.com/jxgapyw/p/4769489.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值