HDU 1671 Phone List(字典树寻找前缀)
2015-08-14 10:28
330 查看
题目意思很清楚:就是判断输入的电话号码中是否有号码是其他号码的前缀,很显然要用到字典树。根据分析可知:
如果字符串Xn=X1X2....Xn是字符串Ym=Y1Y2....Ym的前缀,有在插入的时候有两种情况:Xn在Yn之前插入,Xn在Yn之后插入。
1)如果Xn在Yn之前插入,那么在插入Yn的时候必然经过Xn的路径,此时可以根据判断在这条路径上是否已经有结点被标记已经构成完成的字符串序列来判断是否存在Yn的前缀;
2)如果Xn在Yn之后插入,那么插入完成之后当前指针指向的结点的next数组中的元素必定不全为NULL。
如果字符串Xn=X1X2....Xn是字符串Ym=Y1Y2....Ym的前缀,有在插入的时候有两种情况:Xn在Yn之前插入,Xn在Yn之后插入。
1)如果Xn在Yn之前插入,那么在插入Yn的时候必然经过Xn的路径,此时可以根据判断在这条路径上是否已经有结点被标记已经构成完成的字符串序列来判断是否存在Yn的前缀;
2)如果Xn在Yn之后插入,那么插入完成之后当前指针指向的结点的next数组中的元素必定不全为NULL。
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<sstream> #include<fstream> #include<vector> #include<map> #include<stack> #include<list> #include<set> #include<queue> #define LL long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1 | 1 using namespace std; struct node { int num,id; node *next[10]; node() { num=0;id=0;memset(next,0,sizeof(next));} }; node *p,*root; string str[10005]; void Insert(string s) { p=root; for(int i=0;i<s.size();i++) { int id=s[i]-'0'; if(p->next[id]==0) p->next[id]=new node(); p=p->next[id]; //p->num++; } p->num=1; } int Query(string s) { p=root; for(int i=0;i<s.size();i++) { int id=s[i]-'0'; if(p->next[id]==0) return 1; p=p->next[id]; if(p->num==1&&(i<s.size()-1)) return 0; } // if(p->num>1) return 0; return 1; } void Delete(node *rt) { for(int i=0;i<10;i++) { if(rt->next[i]) { Delete(rt->next[i]); delete(rt->next[i]); } } } int main() { int n,t; cin.sync_with_stdio(false); cin>>t; while(t--) { cin>>n; root=new node(); int flag=0; for(int i=0;i<n;i++) { cin>>str[i]; Insert(str[i]); } for(int i=0;i<n;i++) { if(!Query(str[i])) { flag=1; break; } } if(flag) cout<<"NO"<<endl; else cout<<"YES"<<endl; Delete(root); } return 0; }
相关文章推荐
- java中遍历Map的方法
- Android中ListView结合CheckBox判断选中项
- webapi之fiddler头设置
- 初识Jmeter->安装JMeter
- Fragment生命周期
- 数据库sql
- [ACM] 九度OJ 1553 时钟
- OGG实施操作步骤(包括操作过程中的所有步骤)
- fprintf
- XListView headerView
- Android Studio NDK Opencv fatal error: algorithm: No such file or directory
- 图像缩放—最近邻插值
- maven install问题
- xcworkspace xcodeproj
- 无法解析的外部符号
- Unicode码和中文互转
- String类,StringBuffer和基本数据类型对象包装类(java基础)
- iOS开发分析"秘密"App内容页面的效果(两)
- linux修改yum源
- C++存储方案