*HDU1800字典树

Flying to the Mars

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18240    Accepted Submission(s): 5877

Problem Description


In
the year 8888, the Earth is ruled by the PPF Empire . As the
population growing , PPF needs to find more land for the newborns .
Finally , PPF decides to attack Kscinow who ruling the Mars . Here the
problem comes! How can the soldiers reach the Mars ? PPF convokes his
soldiers and asks for their suggestions . “Rush … ” one soldier answers.
“Shut up ! Do I have to remind you that there isn’t any road to the
Mars from here!” PPF replies. “Fly !” another answers. PPF smiles
:“Clever guy ! Although we haven’t got wings , I can buy some magic
broomsticks from HARRY POTTER to help you .” Now , it’s time to learn to
fly on a broomstick ! we assume that one soldier has one level number
indicating his degree. The soldier who has a higher level could teach
the lower , that is to say the former’s level > the latter’s . But
the lower can’t teach the higher. One soldier can have only one teacher
at most , certainly , having no teacher is also legal. Similarly one
soldier can have only one student at most while having no student is
also possible. Teacher can teach his student on the same broomstick
.Certainly , all the soldier must have practiced on the broomstick
before they fly to the Mars! Magic broomstick is expensive !So , can
you help PPF to calculate the minimum number of the broomstick needed .
For example :
There are 5 soldiers (A B C D E)with level numbers : 2 4 5 6 4;
One method :
C could teach B; B could teach A; So , A B C are eligible to study on the same broomstick.
D could teach E;So D E are eligible to study on the same broomstick;
Using this method , we need 2 broomsticks.
Another method:
D could teach A; So A D are eligible to study on the same broomstick.
C could teach B; So B C are eligible to study on the same broomstick.
E with no teacher or student are eligible to study on one broomstick.
Using the method ,we need 3 broomsticks.
……

After checking up all possible method, we found that 2 is the minimum number of broomsticks needed.

Input

Input file contains multiple test cases.
In a test case,the first line contains a single positive number N indicating the number of soldiers.(0<=N<=3000)
Next
N lines :There is only one nonnegative integer on each line ,
indicating the level number for each soldier.( less than 30 digits);

Output

For each case, output the minimum number of broomsticks on a single line.

Sample Input

4

10

20

30

04

5

2

3

4

3

4

Sample Output

1

2

Author

[email protected]

题意:

速度大小递增的分在一个集合里,即速度大小不同的才能在一个集合里,问最少分几个集合。

代码:

 1 //本质就是找最多有多少相同的数字。处理前导零,还有这个数就是0的情况;又糊涂了,竟然把每个经过的点都加了一,只加最后一个才能标记一个数啊!!!
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<malloc.h>
 6 using namespace std;
 7 struct Trie
 8 {
 9     int v;
10     Trie *next[10];
11 };
12 Trie *root;
13 void init()
14 {
15     root=new Trie;
16     for(int i=0;i<10;i++)
17     root->next[i]=NULL;
18     root->v=0;
19 }
20 int Tinsert(char s[])
21 {
22     int len=strlen(s),j=0;
23     Trie *p=root,*q;
24     for(int i=0;i<len;i++)
25     {
26         if(s[i]!=‘0‘||i==len-1)
27         {
28             j=i;
29             break;
30         }
31     }
32     for(int i=j;i<len;i++)
33     {
34         int id=s[i]-‘0‘;
35         if(p->next[id]==NULL)
36         {
37             q=new Trie;
38             q->v=0;
39             for(int i=0;i<10;i++)
40             q->next[i]=NULL;
41             p->next[id]=q;
42         }
43         p=p->next[id];
44     }
45     p->v++;
46     return p->v;
47 }
48 void Tdelete(Trie *t)
49 {
50     if(t==NULL)
51     return;
52     for(int i=0;i<10;i++)
53     if(t->next[i]!=NULL)
54     Tdelete(t->next[i]);
55     free(t);
56 }
57 int main()
58 {
59     int n;
60     char ch[33];
61     while(scanf("%d",&n)!=EOF)
62     {
63         init();
64         int ans=0;
65         for(int i=0;i<n;i++)
66         {
67             scanf("%s",ch);
68             int tem=Tinsert(ch);
69             if(tem>ans) ans=tem;
70         }
71         printf("%d\n",ans);
72         Tdelete(root);
73     }
74     return 0;
75 }
时间: 2024-10-21 10:59:56

*HDU1800字典树的相关文章

HDU1800 Flying to the Mars【字典树】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1800 题目大意: 有N个士兵.用不同的整数表示不同的级别.级别高的士兵可以教级别低的士兵,他们可以共用一把 扫帚.一个士兵最多只能有一个学生或一个老师.问:最少需要几把扫帚. 思路: 对于士兵都不相同的士兵,只需要一把扫帚.那么问题转变为找出给出数理重复次数最多的个数.建 立字典树,将每个数当作字符串插入字典树中,记录每个数出现的次数,最后找出重复出现次数的最 大值即为所求.注意:04和4都表示4

字典树(Trie)

 字典树:又称为Trie,是一种用于快速检索的多叉树结构.Trie把要查找的关键词看作一个字符序列,并根据构成关键词字符的先后顺序构造用于检索的树结构:一棵m度的Trie树或者为空,或者由m棵m度的Trie树构成. 注意:和二叉查找树不同的是,其节点并非存储一个元素. 优点:1.利用公共内存,以达到节约内存的目的 2.根节点只存储其子树,不存储字母 3.每个节点代表的字母都不同 基本定义: typedef struct Node { struct Node*child[26]; int n;

Flying to the Mars HDU - 1800(字典树)

Flying to the Mars HDU - 1800 题目链接:https://vjudge.net/problem/HDU-1800 题目:在8888年,地球由PPF帝国统治.随着人口的增长,PPF需要为新生儿寻找更多的土地.最后,PPF决定攻击统治火星的Kscinow.问题来了!士兵怎么能到达火星? PPF召集他的士兵并询问他们的建议. “匆匆......”一名士兵回答. “闭嘴 !我是否必须提醒你,从这里到火星没有任何道路!“PPF回复道. “飞!”另一个答案. PPF笑道:“聪明的

hdu 1251 统计难题(字典树)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提

51nod round3# 序列分解(折半枚举+字典树)

小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小刀试着把这个序列分解成两个长度为n/2的子序列. 这两个子序列必须满足以下两个条件: 1.他们不能相互重叠. 2.他们要完全一样. 如果小刀可以分解成功,大刀会给小刀一些糖果. 然而这个问题对于小刀来说太难了.他想请你来帮忙. Input 第一行给出一个T,表示T组数据.(1<=T<=5) 接下来每一组数据,输入共2行. 第一行包含一个整数n (2<=n<=40且为偶数). 第二行给出n

白话算法与数据结构之【字典树】

1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

poj 3764 The xor-longest Path(字典树)

题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值,找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每个节点到根节点路径的亦或和rec,那么任意路径均可以表示rec[a] ^ rec[b],所以问题 就转换成在一些数中选出两个数亦或和最大,那么就建立字典树查询即可. #include <cstdio> #include <cstring> #include <algorithm> us

字典树

字典树(Trie)是一种很特别的树状信息检索数据结构,如同其名,它的构成就像一本字典,可以让你快速的进行字符插入.字符串搜索等. Trie 一词来自 retrieval,发音为 /tri:/ "tree",也有人读为 /tra?/ "try". 字典树设计的核心思想是空间换时间,所以数据结构本身比较消耗空间.但它利用了字符串的共同前缀(Common Prefix)作为存储依据,以此来节省存储空间,并加速搜索时间.Trie 的字符串搜索时间复杂度为 O(m),m 为最