HDOJ2072-单词数(Tire树)

Problem Description

lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

Input

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。

Output

每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

Sample Input

you are my friend

#

Sample Output

4

Solve:字典树模板题,当然也可以用set搞一搞

Code(set):

 1 #include<iostream>
 2 #include<string>
 3 #include<sstream>
 4 #include<set>
 5 using namespace std;
 6 int main()
 7 {
 8     string in;
 9     set<string> all;
10     while(getline(cin,in))
11     {
12         all.clear();
13         if(in[0]==‘#‘)
14             return 0;
15         stringstream ss(in);
16         string out;
17         while(ss>>out)
18         {
19             all.insert(out);
20         }
21         cout<<all.size()<<endl;
22     }
23 }

Code(Tire):

  1 #pragma comment(linker, "/STACK:36777216")
  2
  3 #include <bits/stdc++.h>
  4 using namespace std;
  5 #define LSON            id << 1 , l , mid
  6 #define RSON            id << 1 | 1 , mid + 1 , r
  7 #define ROOT            1 , 1 , n
  8 #define CLR(x , y)      memset(x , y , sizeof(x))
  9 #define LOWBIT(x)       x & (-x)
 10 #define FORN(i , a , n)  for(int i = (a) ; i <= (n) ; ++i)
 11 #define FORP(i , n , a)  for(int i = (n) ; i >= (a) ; --i)
 12 #define CASE(x)        printf("Case %d: ", x)
 13 #define SFD(x)      scanf("%lf" , &x)
 14 #define SFC(x)      scanf(" %c" , &x)
 15 #define SFS(x)      scanf(" %s" , x)
 16 #define SFI(x)      scanf("%d" , &x)
 17 #define SFL(x)      scanf("%lld" , &x)
 18 #define SFI64(x)    scanf("%I64d" , &x)
 19 #define PFF(x)         printf("%f" , x)
 20 #define PFD(x)         printf("%lf" , x)
 21 #define PFI(x)         printf("%d" , x)
 22 #define PFC(x)         printf("%c" , x)
 23 #define PFS(x)         printf("%s" , x)
 24 #define PFI64(x)       printf("%I64d" , x)
 25 #define PFL(x)         printf("%lld\n" , x)
 26 #define SPACE          printf(" ")
 27 #define PUT            puts("")
 28 #define LPUP(i , j , k) for(int i = j ; i <= k ; ++i)
 29 #define LPDW(i , j , k) for(int i = j ; i >= k ; --i)
 30 #define PB(x)          push_back(x)
 31 #define ALL(A)         A.begin(), A.end()
 32 #define SZ(A)          int((A).size())
 33 #define LBD(A, x)      (lower_bound(ALL(A), x) - A.begin())
 34 #define UBD(A, x)      (upper_bound(ALL(A), x) - A.begin())
 35 #define LOCAL
 36 static const double PI = acos(-1.0);
 37 static const double EPS = 1e-8;
 38 static const int INF = 0X3fffffff;
 39 typedef long long LL;
 40 typedef double DB;
 41 template<class T> inline
 42 T read(T &x)
 43 {
 44     x = 0;
 45     int f = 1 ; char ch = getchar();
 46     while (ch < ‘0‘ || ch > ‘9‘) {if (ch == ‘-‘) f = -1; ch = getchar();}
 47     while (ch >= ‘0‘ && ch <= ‘9‘) {x = x * 10 + ch - ‘0‘; ch = getchar();}
 48     x *= f;
 49 }
 50
 51 /************************Little Pea****************************/
 52
 53 static const int MAXN = 30;
 54 int ans = 0;
 55 struct Node
 56 {
 57     int v;
 58     Node* next[MAXN];
 59     Node()
 60     {
 61         v = 0;
 62         CLR(next , NULL);
 63     }
 64 };
 65 void Insert(string s , int len , Node* root)
 66 {
 67     Node* p = root;
 68     LPUP(i , 0 , len - 1)
 69     {
 70         int id = s[i] - ‘a‘;
 71         if(p->next[id] == NULL)
 72             p->next[id] = new Node();
 73         p = p->next[id];
 74     }
 75     ++(p->v);
 76 }
 77 int Search(Node* T)
 78 {
 79     if(T == NULL)
 80         return 0;
 81     LPUP(i , 0 , 25)
 82     {
 83         if(T->next[i] != NULL)
 84             Search(T->next[i]);
 85     }
 86     if(T->v)
 87         ++ans;
 88     return 0;
 89 }
 90
 91 string data;
 92 int main()
 93 {
 94 #ifdef LOCAL
 95     //freopen("D:\\系统优化\\Desktop\\littlepea\\in.data" , "r" , stdin);
 96 #endif
 97     while(getline(cin , data))
 98     {
 99         ans = 0;
100         Node* root = new Node();
101         if(data[0] == ‘#‘)
102             return 0;
103         stringstream ss(data);
104         string out;
105         while(ss >> out)
106         {
107             int len = SZ(out);
108             Insert(out , len , root);
109         }
110         Search(root);
111         PFI(ans);PUT;
112     }
113 }

时间: 2024-10-21 19:07:00

HDOJ2072-单词数(Tire树)的相关文章

hdu2072 单词数 字典树

字典树裸题 1 #include<stdio.h> 2 #include<string.h> 3 int next[5000][26]; 4 bool is_e[5000]; 5 int cnt; 6 int ans; 7 8 void Insert(char *word,int s1){ 9 int root=0; 10 for(int i=0;i<s1;i++){ 11 if(next[root][word[i]-'a']<0){ 12 next[root][wor

HDU 4825 tire树

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 2505    Accepted Submission(s): 1076 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Ze

Ancient Printer(tire树)

Ancient Printer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 1511    Accepted Submission(s): 748 Problem Description The contest is beginning! While preparing the contest, iSea wanted to pri

Tire树

Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计和排序大量的字符串(但不仅限于字符串), 所以经常被搜索引擎系统用于文本词频统计. 优点 利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高. 比如说我们想储存3个单词,sky.skyline.skymoon.如果只是单纯的按照以前的字符数组存储的思路来存储的话,那么我们需要定义三个字符串数组.但是如果我们用字典树的话,只需要定义一个树就可以了.在这里我们就可以看到字典树

UVa 1401 (Tire树) Remember the Word

d(i)表示从i开始的后缀即S[i, L-1]的分解方法数,字符串为S[0, L-1] 则有d(i) = sum{ d(i+len(x)) | 单词x是S[i, L-1]的前缀 } 递推边界为d(L) = 1,代表空串. 将前n个单词构造一颗Tire树,在树中查找后缀的过程中遇到一个单词节点就代表找到一个状态转移中的x 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxnode = 400000 + 10; 5 co

Java Tire树

Tire树,又叫字典树,主要是用来查找单词,词频统计的. 老规矩,直接上代码. package tireTree; public class TireTree { TireNode root; public TireTree(TireNode root) { this.root = root; } private void insertElement(TireNode root, String word) { if (word == null || word.isEmpty()) return;

中文分词系列(二) 基于双数组Tire树的AC自动机

秉着能偷懒就偷懒的精神,关于AC自动机本来不想看的,但是HanLp的源码中用户自定义词典的识别是用的AC自动机实现的.唉-没办法,还是看看吧 AC自动机理论 Aho Corasick自动机,简称AC自动机,要学会AC自动机,我们必须知道什么是Trie,也就是字典树.Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.之

Tire树简介

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 典型应用:用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 缺点:空间复杂度比较大 -> 优化:我们可以用链表来动态开辟空间,达到空间上利用率的最大化 如下图就是一棵由字符串abcd,  abd,   bcd,   efg,  hij  组成的tire树 Tire树的性质: 1.根结点

HDU2072 单词数 【STL】+【strtok】

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28045    Accepted Submission(s): 6644 Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Inp

作业-- 统计文本文件中的字符数、单词数、行数

用AndroidStudio解析统计文本文件中的字符数.单词数.行数. 代码部分: package administrator.mc; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widge