(续)hdu1800_Fying_to_the_Mars
2016-07-15 11:11
369 查看
看了字典树之后自己编写的一个使用字典树解决的程序。其中要注意的几点是:
1. 数据0 00 000 0000等连续的零需要所做一个数据
这个数据会最终存到根节点中,因此特别需要注意的就是初始化数据。
2. 并不需要每个字符都对节点中的v加一,而仅仅到了最后的时候加一就可以,可以提高效率。
1. 数据0 00 000 0000等连续的零需要所做一个数据
这个数据会最终存到根节点中,因此特别需要注意的就是初始化数据。
2. 并不需要每个字符都对节点中的v加一,而仅仅到了最后的时候加一就可以,可以提高效率。
#include <iostream> #include <algorithm> #include <string> #include <cstdio> using namespace std; struct wtre_type{ struct wtre_type *next[10]; int v; }; //向字典序中插入点 int maxvalue; struct wtre_type * root; void free_wtre(wtre_type * t) { if(t!=NULL) { for(int i=0;i<10;i++) free_wtre(t->next[i]); free(t); } } int insert_wtr(char str[35]) { int len = strlen(str); int j=0; while(str[j]=='0')j++; //找到第一个不是零的数 //printf("*%s\n",str+j); wtre_type * p = root; wtre_type * q = NULL; for(;j<len;j++) { int index = str[j]-'0'; //printf("index=%d\n",index); if(p->next[index]==NULL) { q = (wtre_type *)malloc(sizeof(wtre_type)); for(int i=0;i<10;i++) q->next[i]=NULL; q->v = 0; p->next[index]=q; //初始化一个节点给这个数据 } p=p->next[index]; } p->v++; //printf("p->v = %d\n",p->v); return p->v; } int main() { int N; while(scanf("%d",&N)!=EOF) { char str[35]; maxvalue = 0; root = (wtre_type *)malloc(sizeof(wtre_type)); root->v=0; for(int i=0;i<10;i++) root->next[i]=NULL; for(int i=0;i<N;i++) { scanf("%s",str); int num = insert_wtr(str); if(num>maxvalue) maxvalue = num; } printf("%d\n",maxvalue); free_wtre(root); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法