HDU2072 单词数(字典树)
http://acm.hdu.edu.cn/showproblem.php?pid=2072
题意:中文题目不需要说了!~自己注意一下他输入要求:一行表示一篇文章。
这几天都在刷字典树的题,测试测试自己的模板合适不合适。模板倒是合适的,但是却发现自己在处理数据上容易犯下一些细节错误!~
特在此写下来,谨记自己!~
这份代码是一发就过的:
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 { 17 return c-'a'; 18 }///得到字符的id 19 20 void init()///初始化根节点 21 { 22 root=(Trie *)malloc(sizeof(Trie)); 23 for(int i=0; i<MAX; i++) 24 root->next[i]=NULL; 25 root->v=0; 26 } 27 int deal(Trie *p)///删除指针,释放空间,有些题要释放空间不让会MLE 28 { 29 if(p==NULL) 30 return 0; 31 for(int i=0; i<MAX; i++) 32 { 33 if(p->next[i]!=NULL) 34 deal(p->next[i]); 35 } 36 free(p); 37 return 0; 38 } 39 void Insert(char s[])///字典树的建立 40 { 41 Trie *p=root; 42 int len_s=strlen(s); 43 for(int i=0; i<len_s; i++) 44 { 45 int id=Get_ID(s[i]); 46 if(p->next[id]==NULL) 47 { 48 Trie *q=(Trie *)malloc(sizeof(Trie)); 49 for(int j=0; j<MAX; j++) 50 q->next[j]=NULL; 51 q->v=0; 52 p->next[id]=q; 53 } 54 p=p->next[id]; 55 } 56 p->v=1; 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 char str[maxn]; 76 while(gets(str)) 77 { 78 if(str[0]=='#') 79 break; 80 deal(root); 81 init(); 82 int ans=0; 83 int len=strlen(str); 84 for(int i=0; i<len; i++) 85 { 86 char s[100]; 87 int cnt=0; 88 if(str[i]>='a'&&str[i]<='z') 89 { 90 while(str[i]>='a'&&str[i]<='z') 91 { 92 s[cnt]=str[i]; 93 cnt++; 94 i++; 95 } 96 s[cnt]='\0'; 97 if(!Search(s)) 98 { 99 ans++; 100 Insert(s); 101 } 102 } 103 } 104 printf("%d\n",ans); 105 } 106 return 0; 107 }
代码
下面这份是发现一些细节上的问题,之后改正了,才AC了的。
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 { 17 return c-'a'; 18 }///得到字符的id 19 20 void init()///初始化根节点 21 { 22 root=(Trie *)malloc(sizeof(Trie)); 23 for(int i=0; i<MAX; i++) 24 root->next[i]=NULL; 25 root->v=0; 26 } 27 int deal(Trie *p)///删除指针,释放空间,有些题要释放空间不让会MLE 28 { 29 if(p==NULL) 30 return 0; 31 for(int i=0; i<MAX; i++) 32 { 33 if(p->next[i]!=NULL) 34 deal(p->next[i]); 35 } 36 free(p); 37 return 0; 38 } 39 void Insert(char s[])///字典树的建立 40 { 41 Trie *p=root; 42 int len_s=strlen(s); 43 for(int i=0; i<len_s; i++) 44 { 45 int id=Get_ID(s[i]); 46 if(p->next[id]==NULL) 47 { 48 Trie *q=(Trie *)malloc(sizeof(Trie)); 49 for(int j=0; j<MAX; j++) 50 q->next[j]=NULL; 51 q->v=0; 52 p->next[id]=q; 53 } 54 p=p->next[id]; 55 56 } 57 p->v=1; 58 } 59 int Search(char s[])///查找,看是否有条件满足 60 { 61 Trie *p=root; 62 int len_s=strlen(s); 63 for(int i=0; i<len_s; i++) 64 { 65 int id=Get_ID(s[i]); 66 if(p->next[id]==NULL) 67 return 0;///没有找到以s为前缀的字符串 68 p=p->next[id]; 69 } 70 if(p->v) 71 return 1;///找到了以s串味前缀的字符串 72 return 0; 73 } 74 int main() 75 { 76 77 char str[maxn]; 78 init(); 79 while(gets(str)) 80 { 81 if(str[0]=='#') 82 break; 83 deal(root); 84 init(); 85 int ans=0; 86 int len=strlen(str); 87 for(int i=0; i<len; i++) 88 { 89 char s[100]; 90 int cnt=0; 91 while(str[i]>='a'&&str[i]<='z') 92 { 93 s[cnt]=str[i]; 94 cnt++; 95 i++; 96 } 97 s[cnt]='\0'; 98 if(cnt&&!Search(s))///这里要判断cnt是否为0, 99 { ///因为如果为0.我们肯定查找不到,从而使答案多加1了 100 ans++; ///算是一个小细节吧! 101 Insert(s); 102 } 103 } 104 printf("%d\n",ans); 105 } 106 return 0; 107 }
代码2
怎么感觉自己每次都不能一次AC,每次都会在细节上出点错误!~好心痛啊,哎~仔细啊~仔细~
转载于:https://www.cnblogs.com/Y-Meng/p/8595606.html
HDU2072 单词数(字典树)相关推荐
- HDU2072 单词数(解法二)【废除!!!】
本文废除!!! 参考链接:HDU2072 单词数[水题] 问题链接:HDU2072 单词数. 问题描述:参见上文. 问题分析:这是一个比较简单的问题,一行一行读入字符串,统计该行有几个单词.单词之间只 ...
- HDU2072 单词数【水题】
单词数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu4099(斐波那契数+字典树)
题意: 给出一个数字n,在斐波那契数列中找到一个最小下标,满足这个斐波那契数是以n为前缀,输出这个下标. 思路: 高精度+字典树+1000000000000000进制.后来知道在斐波那契数很大的时候, ...
- 648. 单词替换 : 字典树的经典运用
题目描述 这是 LeetCode 上的 648. 单词替换 ,难度为 中等. Tag : 「字典树」 在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词 ...
- hdu2072单词数(思维)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDU-2072 单词数 水题一枚
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 map判重即可: 1 //STATUS:G++_AC_0MS_376KB 2 #include& ...
- leetcode 212. 单词搜索 II 字典树+深度优先搜索 java代码 详细解释
给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格 ...
- 字典树实现_【Leetcode每日打卡】单词的压缩编码 Trie(字典树)入门
一.前言(鸡汤(一段废..话..可以跳过啦)) 同学们好!没想到我这个小小的公众号破千粉啦,对于大佬们而言或许不值一提,但是对我而言是一个莫大的鼓舞!更加坚定了我持续输出优质内容的决心.希望我们都能每 ...
- gym:Problem B Bless You Autocorrect!(字典树+最短路)
2016-2017-acmicpc-nordic-collegiate-programming-contest-ncpc-2016 Problem B Bless You Autocorrect! 题 ...
- 字符串处理【字典树】 - 原理 字典树详解
字符串处理[字典树] - 原理 字典树详解 字典树,又称Trie树.单词查找树,是一种树形结构,也是哈希树的一种变种,主要用于统计.排序和存储大量的字符串(但不限于字符串),所以经常被搜索引擎系统用于 ...
最新文章
- 应用层下的人脸识别(四):人脸研判
- 细说Asp.net的IP地址屏蔽功能设计
- 【LOJ】#3098. 「SNOI2019」纸牌
- Maven根据不同环境打包不同配置文件
- CNCC 技术论坛 | 知识图谱赋能数字经济
- 中国股市悬着四把利剑
- 【Kafka】Kafka Streams简介
- codevs 5958 无
- Java 数组转字符串
- Redis的安装(windows)
- UniCode编码表 对照表
- java蓝牙串口调试,安卓版蓝牙串口调试助手(源码)
- python测试工程师简历模板_自动化测试工程师简历专业技能怎么写
- 物联那点事儿之自制网络温湿度计(arduino+点灯科技篇)
- 【GPT-4】立即停止训练比 GPT-4 更强的模型,至少六个月!马斯克、图灵奖得主等数千 AI 专家紧急呼吁
- 固态硬盘安装--系统迁移--设置引导启动项
- html如何设置radio单选按钮默认选中效果
- 2020中老年直播/短视频用户争夺新战局观察
- 锐捷三层交换机route-map设置
- 被字句15个_把字句改成被字句