【字典树】hdu 1251 统计难题

http://acm.hdu.edu.cn/showproblem.php?pid=1251

第一道字典树,很好理解就是单词查找树(树形词典的味道),输入前缀返回从根节点到该节点组成的串为前缀的个数。注意内存丫!丫 ! 丫!

/*
   hdu 1251 字典树
   空间换时间,容易爆内存
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define INF 0x7fffffff
#define inf -INF
#define MM 12900
#define N 50
using namespace std;
typedef long long ll;
const int _max = 100 + 10;

struct Trie{
  Trie *next[26];
  int cnt;//从根节点到该节点组成的串为前缀的个数
}*root;

void insert(char *s){
  Trie *p = root,*pnew;
  for(int i = 0; i < strlen(s);++ i){
    int x = s[i]-'a';
    if(p->next[x]==NULL){
       pnew = new Trie;
       pnew->cnt = 1;
       for(int j = 0; j < 26; ++ j)
            pnew->next[j] = NULL;
       p->next[x] = pnew;
    }
    else p->next[x]->cnt++;
    p=p->next[x];
  }
}

int search(char *s){
  Trie *p = root;
  for(int i = 0; i < strlen(s);++ i){
    int x = s[i]-'a';
    if(p->next[x]==NULL) return 0;
    p=p->next[x];
  }
  return p->cnt;//从根节点到该节点组成的串为前缀的个数
}

void init(){
  root = new Trie;
  root->cnt = 0;
  for (int i = 0;i < 26;i ++)
    root->next[i] = NULL;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
    char str[20];
    init();
    while(gets(str)&&strcmp(str,"")!=0){
        insert(str);
    }
    while(gets(str)){
        printf("%d\n",search(str));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值