2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
NO YES
输入时一边用一个字符串数组存储所有输入的字符串,一边插入字典树。
全部输入完毕之后,遍历之前所有输入的字符串,判断是否是某个号码的前缀。
这里注意因为肯定会和自身一次有匹配成功,所以匹配数大于1时才是和别的字符串匹配成功,即等于1时输出YES,大于1时输出NO。
/* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:tree.cpp * 作 者:单昕昕 * 完成日期:2016年5月4日 * 版 本 号:v1.0 */ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; struct Node { int num,next[11];//num是树的数目,next指向子树 }; Node a[100000]; int e;//e是当前树序号 string ss[100000];//存储所有输入的字符串 void Insert(char str[]) { int i,p=1; for (i=0; str[i]; i++) { if (a[p].next[str[i]-'0']==0)//如果当前字母没有出现过 { a[p].next[str[i]-'0']=++e; a[e].num=0; } p=a[p].next[str[i]-'0']; a[p].num++; } } int Search(string str)//遍历输出 { int i,p=1; for (i=0; str[i]; i++) { if (a[p].next[str[i]-'0']) p=a[p].next[str[i]-'0'];//如果存在当前字符串 else return 0;//不存在直接判0 } return a[p].num; } int main () { int t; cin>>t; while(t--) { e=1; memset(a,0,sizeof(Node)*100000);//清空初始化 int n,i; cin>>n; getchar();//因为下面用gets所以这里要加一句 char str[20]; for(i=0; i<n; ++i) { gets(str); ss[i]=str;//把读入的所有字符串都保存到ss中 Insert (str);//插入到字典树中 } int flag;//是否重复的标记 for(i=0; i<n; ++i) { string temp=ss[i];//读取存入的字符串 if(Search(temp)!=1)//因为肯定会和自身一次有匹配成功,所以大于1时是和别的字符串匹配成功 { flag=1; break; } else flag=0; } if(flag) cout<<"NO"<<endl; else cout<<"YES"<<endl; } return 0; }