POJ3630Phone List(字典树)
2014-03-01 21:24
330 查看
经典的字典树的题目了,这次完全是按照自己的风格来写的,没有参考其他人的代码风格来写。
分析:如果采用常规的暴力枚举,那么复杂度就是O(n*n*str.length) = O(10^9),这明显是会超时的
采用字典树的方式的话所有的字符串的每一个字符都只会被访问一次,所以复杂度就是O(n*str.length) = O(10^5)
这个复杂度也很好分析:由于每一个字符串的长度不会超过10,那么当建一颗字典树时,那它的高度就不会超过10,就算最后没有一个会产生矛盾的号码,那么也只有n(10^4)个叶子节点
分析:如果采用常规的暴力枚举,那么复杂度就是O(n*n*str.length) = O(10^9),这明显是会超时的
采用字典树的方式的话所有的字符串的每一个字符都只会被访问一次,所以复杂度就是O(n*str.length) = O(10^5)
这个复杂度也很好分析:由于每一个字符串的长度不会超过10,那么当建一颗字典树时,那它的高度就不会超过10,就算最后没有一个会产生矛盾的号码,那么也只有n(10^4)个叶子节点
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <ctime> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX(a,b) (a > b ? a : b) #define MIN(a,b) (a < b ? a : b) #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define lson k<<1, L, mid #define rson k<<1|1, mid+1, R typedef long long LL; const double eps = 1e-12; const int MAXN = 100005; const int MAXM = 500005; int T, n, tree[100010][12], now; char s[12]; bool addToTree(char* str)//添加成功返回true,产生矛盾返回false { int last = 0; for(int i=0;str[i];i++) { int num = str[i]-'0'; if(tree[last][num]>0)last=tree[last][num];//这条路已经存在,沿着这条路走 else if(tree[last][num]==0)//还没走过 { tree[last][num]=++now;//建一条新的边 last = now;// } else if(tree[last][num]==-1)return false;//产生矛盾 } for(int i=0;i<10;i++) if(tree[now][i]==-1)return false;//有两个人的号码相同 else tree[now][i] = -1;//否则的话他之后的所有的都是不可走的 return true; } int main() { scanf("%d", &T); while(T--) { now = 0; mem0(tree); scanf("%d", &n); bool danger=false; for(int i=0;i<n;i++) { scanf("%s", s); if(!danger && !addToTree(s)) danger = true; } printf("%s\n", danger?"NO":"YES"); } return 0; }
相关文章推荐
- Linux—find命令详解
- STL:排序
- try...catch...finally介绍
- 【随笔】写在闪电孵化器分享会之后
- Linux服务器操作系统基础篇
- tomcatx java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl
- 用java代码实现从excel表格读取数据然后写入生成国际化配置文件properties
- CF 396A On Number of Decompositions into Multipliers
- win7系统右键资源管理器崩溃的解决办法
- 经验分享一 自定义ArrayAdapter中的字体
- ACM编程技巧--常用字符操作函数
- 关于笔记本linux亮度调节
- 【uni环境高级编程】2.进程控制笔记
- android Canvas的save和restore(截图)
- Gas Station
- HDU 4004
- myeclipse添加server library
- MutableCopy 与 Copy
- MyEclipse项目里面出现红叉,项目内又没有红叉的解决方案
- 九度oj 题目1015:还是A+B 【ZJU2006考研机试题1】