【字典樹】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;
}


發佈了201 篇原創文章 · 獲贊 45 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章