hdu 1671&&poj 3630 Phone List 【字典树】
2015-06-12 02:23
513 查看
题目链接:http://acm.acmcoder.com/showproblem.php?pid=1671
题意:问是否存在一个串是另一个串的前缀。
解法:建字典树,插入的串的结尾设置标志位,如果以后访问到,则存在一个串是另一个串的前缀。注意释放内存,不然超内存;(太弱,释放内存调了好久。。。
代码:
题意:问是否存在一个串是另一个串的前缀。
解法:建字典树,插入的串的结尾设置标志位,如果以后访问到,则存在一个串是另一个串的前缀。注意释放内存,不然超内存;(太弱,释放内存调了好久。。。
代码:
[code]#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #include <time.h> #include <queue> #include <iterator> using namespace std; typedef struct Trie { int vis; Trie *next[10]; }Trie; Trie *root; int ok; void createTrie(char str[]) { if (ok) return; int len = strlen(str); Trie *p = root, *q; int id; for (int i = 0; i<len; ++i) { id = str[i] - '0'; if (p->next[id] == NULL) { q = new Trie; for (int j = 0; j<10; ++j) q->next[j] = NULL; p->next[id] = q; p->next[id]->vis = 1; if (i == len-1) p->next[id]->vis = -1; p = p->next[id]; } else { if (p->next[id]->vis == -1 || str[i + 1] == '\0') { ok = 1; return; } if (i == len - 1) p->next[id]->vis = -1; p = p->next[id]; } } } void free_memory(Trie *p) { for (int i = 0; i < 10; i++) { if (p->next[i] != NULL) free_memory(p->next[i]); } free(p); } char str[1001000]; int t, n; int main() { scanf("%d",&t); while (t--) { ok = 0; root = new Trie; for (int i = 0; i < 10; i++) { root->next[i] = NULL; root->vis = 0; } scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", str); createTrie(str); } if (!ok) puts("YES"); else puts("NO"); free_memory(root); } return 0; }
相关文章推荐
- 在ubuntu上编译chrome
- 在ubuntu上编译chrome
- Android实时获取网络信号
- Android开发-网络通信1
- iOS文件路径操作
- [.net 面向对象编程基础] (19) LINQ基础
- Red Hat Linux 下命令行界面与图形界面的切换
- 3Sum Closest
- vsftpd,tftp安装配置
- vsftpd,tftp安装配置
- U-Boot启动过程完全分析
- U-Boot启动过程完全分析
- Linux命令详解之六-杂项命令大聚合
- 对于React体系的一点想法
- VS2013MFC单文档工程学习笔记八 - 为窗口添加一张背景图片
- 虚拟机上LINUX环境软件部署
- 采用递归方式查询某目录下的所有文件
- WCF中的异步实现
- Oracle小知识
- 实验五 — — Java网络编程及安全