hdoj 1671(trie树)(要清除动态内存,要不然的话就会mtl)(还有很重要的东西写在代码的最后注释当中)
2012-02-29 20:29
393 查看
#include <iostream> using namespace std; //定义一个结构体 typedef struct Trie{ int v;//表示这一层的元素个数,如果这一层为-1.表示没有元素 Trie *next[10];//下一个节点有10个 }Trie; Trie *root;//声明一个根??????????????? void createTrie(char *str) { int len = strlen(str); Trie *p = root, *q;//p表示游标 for(int i=0; i<len; ++i) { int id = str[i]-'0';//标号 //如果说下一个节点为空,那么新建一个trie树,接上去 if(p->next[id] == NULL) { //生成一个trie树 q = (Trie *)malloc(sizeof(Trie)); q->v = 1; //把新树的其它节点都做成空 for(int j=0; j<10; ++j) q->next[j] = NULL; //接上数 p->next[id] = q; //移动游标 p = p->next[id]; } //如果说这个节点不是空,比如说119和110.当插入119以后,119都是1. //当插入110的时候,v的值变为2.但是9和0都是1 else { p->next[id]->v++; p = p->next[id];//移动游标 } } //最后一个节点定义为空。当插入113的时候,113都插入啦。让后3的下一个是-1 p->v = -1; } //这个find函数还有一点问题。 int findTrie(char *str) { int len = strlen(str); Trie *p = root;//先把游标指向根节点 //一层一层的插入 for(int i=0; i<len; ++i) { int id = str[i]-'0'; p = p->next[id]; //如果说这一层是空, if(p == NULL) return 0; if(p->v == -1) return -1; } return -1; } int deal(Trie* T) {//这是把T清空,一开始没加这个,结果MLE. int i; if(T==NULL) return 0; for(i=0;i<10;i++) { if(T->next[i]!=NULL) deal(T->next[i]); } free(T); return 0; } #define MAX 10005 //#define MAX 10 class Point { public: char name[10]; int length; }; Point point[MAX]; int compare(const void *a,const void *b) { return ((Point*)b)->length-((Point*)a)->length; } int is(char *str) { int len = strlen(str); Trie *p = root, *q;//p表示游标 for(int i=0; i<len; ++i) { int id = str[i]-'0';//标号 //如果说下一个节点值为空,表示不是前缀 if(p->next[id] == NULL) { return 1;//返回1表示不是前缀,可以继续插入 } //如果说这个节点不是空,比如说119和110.当插入119以后,119都是1. //当插入110的时候,v的值变为2.但是9和0都是1 //那么移动游标 else { p = p->next[id];//移动游标 } } return 0;//比如说插入11935,让后插入119,插入以后发现,所有的点都有啦,表示不可以在插入啦 } int main() { //freopen("in.txt", "r", stdin); int nCases, nNum; int i; scanf("%d", &nCases); while(nCases--) { root = (Trie *) malloc (sizeof(Trie));//新建一个trie树。 //把数初始化 for(i=0; i<10; ++i) root->next[i] = NULL; //输入一个数字 scanf("%d", &nNum); for(i=0; i<nNum; ++i) { scanf("%s", point[i].name); point[i].length=strlen(point[i].name); } qsort(point,nNum,sizeof(Point),compare); //开始处理 int flag=1;//表示可以 for(i=0;i<nNum;i++) { //如果说不是前缀,就插入 if(is(point[i].name)) { createTrie(point[i].name); } //如果说是前缀,返回0 else { flag=0; break; } } if(flag==0) printf("NO\n"); else printf("YES\n"); //清除动态内存 deal(root); } return 0; } /* 1 例如911,最后一个1的exist的值是“f”(就是法文的符号)。 2 如果这个点没有元素就是0x00000000如果有元素就是0x2806e0; 3 当比赛的时候,最好看原版的东西。因为都没有经过修改 */
相关文章推荐
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
- 批量清除Word中代码注释
- 图上有两个axes时,第二个axes显示图片时就会出问题,figure上的所有东西都消失了,只剩下最后显示的图片。
- PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
- TensorFlow手写数字MNIST识别,两层卷积神经网路(代码及代码注释)最后的准确率0.99
- 1亿动态pv/天的超级数据库缓存解决方案,开源了,还有测试代码。作者KK
- 给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数
- 整理一下Java动态编译Java代码,并在加载到内存中然后执行类中方法的api的介绍
- tppabs到底是什么东西?对代码有何影响?如何清除tppabs标签
- HDOJ 1241 油田 DFS初级算法 java代码实现 详细注释
- PHP压缩html网页代码原理(清除空格,换行符,制表符,注释标记)
- 1亿动态pv/天的超级数据库缓存解决方案,开源了,还有测试代码。作者KK
- ImageLoader清除内存的方法,两行代码
- HDU--杭电1598--find the most comfortable road--并查集+暴力--反正是大众化的代码,只是我喜欢多写点东西导致我的注释比较多罢了
- OC-内存管理中部分.h文件和.m文件中的代码,注释很重要
- 动态代理示例(根据博客园BillGan代码增加注释和辅助阅读类)
- h264实时编解源代码,不仅有vfw,还有内存和cpu占用多少显示,vc6.0编译环境
- PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
- 建立一个学生结构数组来记录学生信息(学号ID,姓名和C语言成绩),要求动态建立一个结构数组,数组长度从键盘输入,自行给数组元素赋值并打印学生信息,最后不要忘记释放内存。 结构st
- 教你怎么用Mono Cecil - 动态注入 (注意代码的注释)