暑假- Trie树-(D - Phone List)
2015-07-28 10:49
253 查看
/* 题意:给你一堆电话号码,如果没有任何一个人的电话号码是其他的电话号码的前缀,则 输出“YES”,否则输出“NO”。 思路:trie树,是不是其他号码的前缀只要判断最后一个数字出现的次数,若只出现一次则 这个号码不会是其他号码的前缀,否则是其他号码的前缀。 */ #include<iostream> #include<cstring> using namespace std; const int MAXM=100005; struct Node { int value; Node *child[26]; Node() { value=0; memset(child,NULL,sizeof(child)); } }*root; char num[MAXM][15];//保存号码 bool temp;//判断是否出现前缀号码 void create(char s[])//建树 { Node *x=root; for(int i=0;i<strlen(s);i++) { int d=s[i]-'0'; if(x->child[d]==NULL) { x->child[d]=new Node; } x=x->child[d]; } x->value++;//最后一个数字的value++ } void Search(char s[])//判断 { Node *x=root; int len=strlen(s); for(int i=0;i<len;i++)//循环出来后,X即为最后一个数码的节点。 { int d=s[i]-'0'; x=x->child[d]; } if(x->value!=1)//若出现不止一次。 { temp=false; } } void DeleteNode(Node *x)//删除之前节点的信息 { if(x==NULL) { return; } for(int i=0;i<26;i++) { if(x->child[i]!=NULL) { DeleteNode(x->child[i]); } } delete x; } int main() { int t,n; cin>>t; while(t--) { temp=true; cin>>n; root = new Node; for(int i=0;i<n;i++) { cin>>num[i]; create(num[i]); } for(int j=0;j<n;j++) { Search(num[j]); if(temp==false)//只要出现一个前缀字符,其他就不用判断了 { break; } } if(temp) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } DeleteNode(root); } return 0; }
相关文章推荐
- Android Volley完全解析(一),初识Volley的基本用法
- Matlab--多项式
- 讲解如何在Unity的Inspector面板实现类似摄像机层次遮罩的多选效果
- Swift学习记录(Swift和Object-C混编之可选值类型的选择)
- 如何创建你自己的 Git 服务器
- ORACLE大表中删除部分数据最佳方案
- 深入学习JavaScript中的Rest参数和参数默认值
- linux shell 逐行读取文件行
- poj3903 LIS的优化
- hdu 2734(Quicksum)
- c++中sort()及qsort()的用法总结
- 捋捋所遇见的WdatePicker插件的用法
- orm
- iOS开发遇见的坑之二:工程文件中插件和自身工程命名冲突
- POJ 1442 Black Box
- mfc控件位置坐标获取
- android ListView 几个重要属性和使用小技巧
- ionic的tabs学习
- Android线性布局管理器LinearLayout创建--动态生成
- Block知识点梳理