字典树模板+HDU 1671 ( Phone List )(字典树)

字典树指针模板(数组模板暂时还没写):

 1 #include<cstdio>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAX=26;
 6 const int maxn=1e4+100;
 7 int N;
 8
 9 struct Trie
10 {
11     Trie *next[MAX];
12     int v;///v要灵活使用,具体情况具体分析
13 };
14 Trie *root;
15 int Get_ID(char c){
16     return c-‘a‘;
17 }///得到字符的id
18
19 void init()///初始化根节点
20 {
21     root=(Trie *)malloc(sizeof(Trie));
22     for(int i=0;i<MAX;i++)
23         root->next[i]=NULL;
24     root->v=0;
25 }
26 int deal(Trie *p)///删除指针,释放空间,有些题要释放空间不让会MLE
27 {
28     if(p==NULL)
29         return 0;
30     for(int i=0;i<MAX;i++)
31     {
32         if(p->next[i]!=NULL)
33             deal(p->next[i])
34     }
35     free(p);
36     return 0;
37 }
38 void Insert(char s[])///字典树的建立
39 {
40     Trie *p=root;
41     int len_s=strlen(s);
42     for(Int i=0;i<len_s;i++)
43     {
44         int id-Get_ID(s[i]);
45         if(p->next[id]==NULL)
46         {
47             Trie *q=(Trie *)malloc(sizeof(Trie));
48             for(int j=0;j<MAX;j++)
49                 q->next[j]=NULL;
50             q->v=0;
51             p->next[id]=q;
52         }
53         p=p->next[id];
54
55     }
56     p->v++;
57 }
58 int Search(char s[])///查找,看是否有条件满足
59 {
60     Trie *p=root;
61     int len_s=strlen(s);
62     for(int i=0;i<len_s;i++)
63     {
64         int id=Get_ID(s[i]);
65         if(p->next[id]==NULL)
66             return 0;///没有找到以s为前缀的字符串
67         p=p->next[id];
68     }
69     if(p->v)
70         return 1;///找到了以s串味前缀的字符串
71     return 0;
72 }
73 int main()
74 {
75     deal(root);
76     init();
77
78     return 0;
79 }

字典树指针模板

http://acm.hdu.edu.cn/showproblem.php?pid=1671

题意:就是给你一些列的字符串,问你这些字符串中是否存在某一个字符串是其他字符串(可以是一个也可以是多个)的前缀,如果是输出NO,否则输出YES。

字典树的例题,不过要注意的是必须要释放内存,不然会MLE;同时这道题也是对v值得灵活运用。

 1 #include<cstdio>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAX=10;
 6 const int maxn=1e4+100;
 7 int N;
 8 char s[maxn][30];
 9 struct Trie
10 {
11     Trie *next[MAX];
12     int v;
13 };
14 Trie *root;
15 int Get_ID(char c){
16     return c-‘0‘;
17 }
18 void init()
19 {
20     root=(Trie *)malloc(sizeof(Trie));
21     for(int i=0;i<MAX;i++)
22         root->next[i]=NULL;
23     root->v=0;
24 }
25 void Insert(char s[])
26 {
27     int len_s=strlen(s);
28     Trie *p=root;
29     for(int i=0;i<len_s;i++)
30     {
31         int id=Get_ID(s[i]);
32         if(p->next[id]==NULL)
33         {
34             Trie *q=(Trie *)malloc(sizeof(Trie));
35             for(int j=0;j<MAX;j++)
36                 q->next[j]=NULL;
37             q->v=0;
38             p->next[id]=q;
39         }
40         p=p->next[id];
41         p->v++;
42     }
43 }
44
45 int Search(char s[])
46 {
47     Trie *p=root;
48     int len_s=strlen(s);
49     for(int i=0;i<len_s;i++)
50     {
51         int id=Get_ID(s[i]);
52         if(p->next[id]==NULL)
53             return 0;
54         p=p->next[id];
55     }
56         return p->v;
57 }
58 int deal(Trie *p)
59 {
60     if(p==NULL)
61         return 0;
62     for(int i=0;i<MAX;i++)
63     {
64         if(p->next[i]!=NULL)
65             deal(p->next[i]);
66     }
67     free(p);
68     return 0;
69 }
70 int main()
71 {
72     int t;
73     scanf("%d",&t);
74     while(t--)
75     {
76         deal(root);
77         init();
78         scanf("%d",&N);
79         for(int i=0;i<N;i++)
80         {
81             scanf("%s",s[i]);
82             Insert(s[i]);
83         }
84         int flag=0;
85         for(int i=0;i<N;i++)
86         {
87             if(Search(s[i])>1)
88             {
89                 flag=1;
90                 break;
91             }
92         }
93         if(flag)
94             printf("NO\n");
95         else
96             printf("YES\n");
97     }
98     return 0;
99 }

在做这道题的时候刚开始没有释放内存MLE了,之后MAX又取成了9,取小了点,在测试9这个字符的时候又出错了几次。

<.....>

记得要小心啊!~!~!~!~

原文地址:https://www.cnblogs.com/Y-Meng/p/8587898.html

时间: 2024-11-03 01:38:43

字典树模板+HDU 1671 ( Phone List )(字典树)的相关文章

字典树模板 [HDU 1251] 统计难题

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 19054    Accepted Submission(s): 8418 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前

线段树模板hdu 1754:I Hate It

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 100523    Accepted Submission(s): 37845 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的

(字典树)HDU - 1671 Phone List

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671 题意:给很多电话号码,如果在拨号的时候,拨到一个存在的号码,就会直接打出去,以致以这个号码为前缀的所有其他比这个号码长的号码将不能拨出,问是不是所有的号码都能拨. 分析:可以直接建立字典树,节点中用boolean变量表示当前是否组成电话号码,一旦在遍历完某条号码之前,已经出现存在号码,则发现问题,返回false,否则true. 我使用了一个反过来的方法,即只统计前缀出现次数,遍历完某条号码,如

HDU 1671 Phone List (字典树)

Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogu

HDU 1671 Phone List(字典树Trie)

解题思路: 判断是否有一个字符串是另一个字符串的前缀,直接用字典树搞. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <set> #include <stack> #i

HDU 1671 Phone List (Trie树 好题)

Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11721    Accepted Submission(s): 3982 Problem Description Given a list of phone numbers, determine if it is consistent in the sense th

hdu 1671 Phone List (Trie树)

简单的字典树应用,在建树的时候判断就行了. 需要注意的语法: 在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数:使用new和delete就可以既释放对象的内存的同时,调用这个对象的析构函数.所以建立trie时用new更方便一些. 注意要每组数据处理完后释放动态内存(适时释放动态内存是基本素养),否则会造成内存泄漏(提交后导致MLE).还要注意有这么个知识点: delete和free都是只把指针所指向的内存释放掉了,并没有把指针本身干掉

字典树 Trie (HDU 1671)

Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers: 1. Emergency 911 2. Alice 97 625 999 3. Bob 91 12 54 26 In this

hdu 1251 统计难题 字典树

// hdu 1251 统计难题 字典树 // // 题目大意: // // 有一系列的单词表,以空行结尾,之后会有一些字母串,找出以这些字符串 // 作为前缀的单词的个数 // // // 解题思路: // // 字典树 Trie,在插入字符串的时候每遇到一个节点,该节点的值++.查找的时候 // 字符串时,如果找到了,那么返回当前的val,否则返回0,因为没有以这个字符串 // 为前缀的单词. // // // 感悟: // // 这段时间想学学数据结构,就看了看刘老的大白书,感觉用数组挺巧