题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2072

题目概述:

  给你一些句子,统计每个句子中单词的个数。

大致思路:

  这个题有几种思路,一种是用Tire树,在插入单词过程中如果新建了一个节点便说明这个单词是新单词,需要注意的是有些单词可能是另一些的前缀,这里需要特殊处理一下。

  还有就是STL了,map,set都行,因为我没有用STL就不细说了。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <ctime>
 7 #include <map>
 8 #include <queue>
 9 #include <cstring>
10 #include <algorithm>
11 using namespace std;
12
13 #define sacnf scanf
14 #define maxn 10010
15 #define inf 1061109567
16 #define Eps 0.001
17 #define PI 3.1415927
18 #define mod 9973
19 #define MAXNUM 10000
20 void Swap(int &a,int &b) {int t=a;a=b;b=t;}
21 int Abs(int x) {return (x<0)?-x:x;}
22 typedef long long ll;
23
24 struct node
25 {
26     bool End;
27     node *next[26];
28 } tire;
29
30 bool Insert(node *root,char *s2)
31 {
32     node *p=root;int t;
33     bool ans=false;
34     while(*s2!='\0')
35     {
36         t=*s2-'a';
37         if(p->next[t]==NULL)
38         {
39             node *temp=(node *)malloc(sizeof(node));
40             for(int i=0;i<26;i++) temp->next[i]=NULL;
41             temp->End=false;p->next[t]=temp;ans=true;
42         }
43         p=p->next[t];s2++;
44     }
45     if(!p->End) ans=true;
46     p->End=true;
47     return ans;
48 }
49
50 void Delete(node *root)
51 {
52     for(int i=0;i<26;i++)
53         if(root->next[i]!=NULL) Delete(root->next[i]);
54     free(root);
55 }
56
57 int main()
58 {
59     //freopen("data.in","r",stdin);
60     //freopen("data.out","w",stdout);
61     //clock_t st=clock();
62     char s2[maxn];
63     int cnt;char s;
64     while(1)
65     {
66         node *root=(node *)malloc(sizeof(node));
67         for(int i=0;i<26;i++) root->next[i]=NULL;
68         root->End=false;int lenb=0;cnt=0;
69         while(scanf("%c",&s)!=EOF)
70         {
71             if(s=='#') return 0;
72             if(s=='\n') break;
73             if(s<'a'||s>'z')
74             {
75                 if(lenb!=0)
76                 {
77                     s2[lenb]='\0';
78                     if(Insert(root,s2)) cnt++;
79                     lenb=0;
80                 }
81             }
82             else s2[lenb++]=s;
83         }
84         if(lenb!=0)
85         {
86             s2[lenb]='\0';
87             if(Insert(root,s2)) cnt++;
88             lenb=0;
89         }
90         printf("%d\n",cnt);
91         Delete(root);
92     }
93     //clock_t ed=clock();
94     //printf("\n\nTime Used : %.5lf Ms.\n",(double)(ed-st)/CLOCKS_PER_SEC);
95     return 0;
96 }

转载于:https://www.cnblogs.com/CtrlKismet/p/6352112.html

HDOJ2072解题报告【字典树】相关推荐

  1. 655. Print Binary Tree 解题报告(树)

    第一部分:搜索.遍历 [例子1]655. Print Binary Tree Example 1: Input:1/2 Output: [["", "1", & ...

  2. 字典树哇 AC自动机哇 = _ =

    字典树哇 AC自动机哇 = _ = 例题 HDU 1251 统计难题 解题思路 : 字典树 原理:按照每个根向下发散 形成一棵 树 这个题 需要在每一个字母处都做统计 (求前缀单词) 开一个 二维数组 ...

  3. C++解题报告——Rima(字典树+树形DP)

    题目描述 Adrian对单词押韵很感兴趣.如果两个单词的最长公共后缀的长度与两个单词中较长那个的长度一样,或者等于较长单词的长度减一,则这两个单词押韵.换句话说,如果A,B的最长公共后缀LCS(A,B ...

  4. HDOJ 1251 统计难题——第二次用字典树AC题目,写一下解题报告

    第一次用字典树+BFS的方法统计以给定字符串为前缀的单词数目,超时了.百思不得其解,然后我看了一下讨论版里的一位同学的AC代码.豁然开朗,立刻明白了求解相同前缀的单词个数的最简单的解法. 其实在建一科 ...

  5. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  6. 树状数组c语言模板,【树状数组】Cows (POJ2481) PASCAL 解题报告

    [树状数组]Cows (POJ2481) Time Limit:1000MS Memory Limit:65536K Total Submit:16 Accepted:8 Description [问 ...

  7. Codeforces 438D 线段树 解题报告

    D. The Child and Sequence At the children's day, the child came to Picks's house, and messed his hou ...

  8. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机

    目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...

  9. 百度之星初赛(1)解题报告

    超级赛亚ACMer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

最新文章

  1. docker卸载命令_使用docker完成生信分析环境搭建
  2. 深度学习核心技术精讲100篇(五十九)-多业务融合推荐策略实战应用
  3. 淘商们用数据精细化分析客户群体
  4. 自用懒加载(其实效果并不是很好),自带的懒加载还好(2)(优化)
  5. 题目1049:字符串去特定字符
  6. DIY人脸跟踪电风扇送女朋友(3)
  7. C++ 11 深度学习(六)智能指针综述
  8. 中职 计算机老师 教cad,教师博客应用于职校计算机CAD教学探究.doc
  9. java逆向框架,Android逆向之逆向框架层
  10. 爬虫文件存储-2:MongoDB
  11. Java连接数据库代码
  12. 小一寸和一寸照片有区别吗 一寸照片怎么变成小一寸
  13. 8个经典无线射频识别(RFID)优选方案
  14. 设置电脑的背景颜色为保护色
  15. left函数未定义_access中LEFT函数未定义的解决方案\表达式中'left'函数未定义。
  16. 大数据时代,IT行业的热门岗位有哪些?9大前景分析!
  17. android手机变windows8,安卓手机如何把手机界面投屏到windows8/10电脑上
  18. github新手使用指南
  19. 腾讯企业邮箱收费标准多少钱一年 腾讯企业邮箱价格表
  20. 一专多能、刻意练习和终身成长

热门文章

  1. LR中如何添加事务,参数化,检查点,集合点,思考时间等
  2. 模拟电梯控制软件设计c语言,模拟电梯控制系统设计.docx
  3. java虚拟路由器_Java实现模拟路由功能
  4. Android学习笔记篇1. 从按钮的点击事件开始
  5. 电子计算机什么理论,电子计算机的工作原理是什么?
  6. c语言用链表编写简单程序,C语言单链表简单实现(简单程序复杂化)
  7. 净水器怎么放_家中安装净水器后,水却更脏了!这几个常识性问题你不得不知道...
  8. outlook本地存储设置_商务文档为什么要存储在OneDrive for business 上?
  9. 工作群里常见表情的真正含义……
  10. 神器在手,代码命名从此高大上!