字典树 hdu 1075
2015-07-24 11:06
330 查看
#include"stdio.h" #include"ctype.h" #include"stdlib.h" #include"string.h" #include"algorithm" using namespace std; struct Trie { struct Trie * next[26]; int flag; }; char xx[1000005][15]; //数组要开1000000,题目没写那么清楚 Trie * H = NULL; Trie * init() { Trie * l = new Trie; for(int i = 0;i < 26;i ++) { l ->next[i] = NULL; } l ->flag = 0; //初始化为0 return l; } void Add(char * s,int x) { Trie * l = H; int len = strlen(s); for(int i = 0;i < len;i ++) { int k = s[i] - 'a'; if(l ->next[k] == NULL) { l ->next[k] = init(); } l = l ->next[k]; } l ->flag = x; //存起来的时候标记成数组下标 ,查找方便 }; void Cls(Trie * l) { for(int i = 0;i < 26;i ++) { if(l ->next[i] != NULL) { Cls(l ->next[i]); } } free(l); } void Search(char * s) { Trie * l = H; int len = strlen(s); int pl = 1; for(int i = 0;i < len;i ++) { int k = s[i] - 'a'; if(l ->next[k] == NULL) { pl = 0; break; } l = l ->next[k]; } if(l ->flag && pl) //查找看有没有这个单词,有的话就输出对应下标的字符串,添加时的下标记录用上了 { printf("%s",xx[l ->flag]); } else //没找到就输出自己 { printf("%s",s); } } int main() { int a,b,c,d,pl = 0; char vv[30005]; while(~scanf("%s",vv)) { if(strcmp(vv,"START") == 0 && !pl) //先保存到数组 ,下标从一开始,因为一会搜索要用 { H = init(); pl = 1; int l = 1; while(1) { scanf("%s",xx[l]); if(strcmp(xx[l],"END") == 0) break; else { scanf("%s",vv); Add(vv,l); l ++; } } } else { getchar(); //加一个gechar(),因为上面是scanf结尾,要去掉一个回车 pl = 0; while(1) { char mm[20]; gets(vv); if(strcmp(vv,"END") == 0) break; else { int l = strlen(vv); int k = 0; for(int i = 0;i < l;i ++) { if(isalpha(vv[i])) { mm[k++] = vv[i]; } else { if(k > 0) //在mm数组里有值得时候才去搜索,以为mm没有初始化 { mm[k] = '\0'; Search(mm); } k = 0; //个数归零 printf("%c",vv[i]); //输出不是字母的东西,比如'.','!','?',' '之类的 } } printf("\n"); } } Cls(H); //清不清空都行,以为只有一个例子,但我习惯清空了 } } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=1075
相关文章推荐
- Linux的run-level:
- 【转】MySQL日期时间函数大全
- Ubuntu+Win删除分区导致GRUB引导失败的处理
- C# webbrowser实现真正意义上的F5刷新
- sed用例
- jenkins动态参数构建
- Caffe代码导读(1):Protobuf例子
- iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角),ios冰山一角
- for循环
- Case of the Zeros and Ones
- git学习笔记
- PullToRefreshListView下拉刷新与上拉加载
- Java byte与char的区别
- Linux CentOS6.5 防火墙 端口 操作 打开 关闭
- LeetCode 之 Binary Tree Preorder Traversal(树)
- response.setHeader("Content-disposition","attachment;filename="+fileName) 下载时文件名中存在空格错误
- [前端架构]写在前面的话
- iOS给所有的TabBar和NavigationBar换颜色
- Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字
- java.util.logging使用笔记2