AOJ 842 西瓜的编译原理【字典树】
来源:互联网 发布:阿里斯托芬的云 编辑:程序博客网 时间:2024/05/21 11:22
题面:
西瓜在写编译原理作业中的文法分析器的时候,通常需要检测一个单词是否在给定的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树,其特点如下:
根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;
从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;
在满足上述条件下,该单词查找树的节点数最少。
例:图一的单词列表对应图二的单词查找树
对一个确定的单词列表,请统计对应的单词查找树的节点数(包括根节点)
Input
输入一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字符组成,长度不超过63个字符,单词个数不超过5000。
Output
输出仅包含一个整数和一个换行/回车符。该整数为单词列表对应的单词查找树的节点数。
大致思路:
构造字典树,也就是一个26叉树。然后把每个字符串都输入,如果创建新的节点count就加一。
代码:
#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>using namespace std;typedef struct Node{ struct Node *next[26]; Node() { for(int i=0;i<26;++i) next[i]=NULL;//初始化指针 }}DTree;DTree root;int cnt=1;//因为算上根节点,所以初始值为1void Insert(string str){ DTree *p=&root; int len=str.size(); for(int i=0;i<len;++i){ int id=str[i]-'A'; if(p->next[id]==NULL){ DTree *q=(DTree*)malloc(sizeof(DTree));//这么做的话指针没有被初始化,所以后面单独进行初始化处理 for(int i=0;i<26;++i) q->next[i]=NULL; p->next[id]=q; cnt++; } p=p->next[id]; }}int main(){ string str; while(cin>>str) { Insert(str); } cout<<cnt<<endl; return 0;}
0 0
- AOJ 842 西瓜的编译原理【字典树】
- 西瓜的编译原理作业 AOJ 842
- AOJ.842 西瓜的编译原理作业
- 西瓜的编译原理作业
- AOJ-795 西瓜理发记(三)
- 字典树原理
- 字典(C#)之字典的工作原理
- 西瓜就是圆的
- 西瓜的考研成绩
- 和西瓜的第一次
- 西瓜的JSON笔记
- 西瓜
- 西瓜
- Trie树(字典树)的原理及其实现
- TrieTree字典树数据结构的原理、实现及应用
- 字典树原理(转)
- AOJ ALDS1_7_A 树
- AOJ
- (转)Android开发-Activity中finish() onDestroy() 和System.exit()的区别
- 【面试库】--HashMap多线程put后get null ,get 死循环,get数据丢失(167)
- leetcodeOJ 90. Subsets II
- @Repository、@Service、@Controller 和 @Component(转载)
- Android MD5加密工具类
- AOJ 842 西瓜的编译原理【字典树】
- Android安全输入设计与思考
- 接口文档
- 了解BitSet类并实现素数筛选--Eratosthenes筛选法
- Dom4JUtils工具类(查找对象,回写操作)
- input设置不可编辑后台获取不到数据
- 抽象类,接口与其中最为关键的构造函数概念
- 智力竞赛 编程题解析
- 浅谈大数据框架调用过程中用到的RPC