hdu 1251 统计难题 (trie树模板题)

hdu 1251 题目链接

题意:先给一个单词表,然后给出若干查询,每个查询一个单词,问单词表中以这个单词为前缀的单词的个数。

思路:trie树裸题。第一次写trie树。。感觉要注意的是trie树是一个比较耗费空间的数据结构。。? 以及动态开辟内存记得free…?

  1/* ***********************************************
  2Author :111qqz
  3Created Time :2016年08月14日 星期日 19时58分41秒
  4File Name :code/hdu/1251.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <stack>
 14#include <set>
 15#include <map>
 16#include <string>
 17#include <cmath>
 18#include <cstdlib>
 19#include <deque>
 20#include <ctime>
 21#define fst first
 22#define sec second
 23#define lson l,m,rt<<1
 24#define rson m+1,r,rt<<1|1
 25#define ms(a,x) memset(a,x,sizeof(a))
 26typedef long long LL;
 27#define pi pair < int ,int >
 28#define MP make_pair
 29
 30using namespace std;
 31const double eps = 1E-8;
 32const int dx4[4]={1,0,0,-1};
 33const int dy4[4]={0,-1,1,0};
 34const int inf = 0x3f3f3f3f;
 35char s[20];
 36
 37struct Trie
 38{
 39    struct Node
 40    {
 41	Node *nxt[26];
 42	int cnt;
 43	Node()
 44	{
 45	    for ( int i = 0 ; i < 26;  i++) nxt[i]=NULL;
 46	    cnt = 0 ;
 47	}
 48    };
 49    Node *root;
 50    void init()
 51    {
 52	root = new Node();
 53    }
 54    Trie()
 55    {
 56	root = new Node();
 57    }
 58    void Insert(char *s)
 59    {
 60	Node *u = root;
 61	int len = strlen(s);
 62	for ( int i = 0 ; i < len ; i++)
 63	{
 64	    int v = s[i]-'a';
 65	    if (u->nxt[v]==NULL) u->nxt[v]=new Node();
 66	    u = u->nxt[v];
 67	    u->cnt++;
 68	}
 69    }
 70    int Find(char *s)
 71    {
 72	Node *u = root;
 73	int len = strlen(s);
 74	for ( int i = 0 ; i < len ; i++)
 75	{
 76	    int v = s[i]-'a';
 77	    if (u->nxt[v]==NULL) return 0;
 78	    u = u->nxt[v];
 79	}
 80	return u->cnt;
 81    }
 82
 83}trie;
 84int main()
 85{
 86	#ifndef  ONLINE_JUDGE 
 87	freopen("code/in.txt","r",stdin);
 88  #endif
 89
 90	while (gets(s))
 91	{
 92	    int len = strlen(s);
 93	    if (len==0) break;
 94	    trie.Insert(s);
 95	}
 96	while (gets(s))
 97	{
 98	    int ans = trie.Find(s);
 99	    printf("%d\n",ans);
100	}
101
102  #ifndef ONLINE_JUDGE  
103  fclose(stdin);
104  #endif
105    return 0;
106}