思路: 使用trie树..将电话号码s插入树中,如果发现s的前缀已存在或者是s是前面的号码的前缀,则输出"NO"..全部都成功插入则"YES"
这里的trie树要用数组表态实现,动态建树会TLE….
数组要开到100000这个数量级…不然会RUNTIME ERROR


1 //Accepted 4484K 172MS C++ 993B 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #define M 10 6 using namespace std; 7 int ii; 8 bool flag; 9 struct Tree{ 10 Tree* next[M]; 11 int val; 12 }; 13 14 Tree node[100010]; 15 16 Tree *root = &node[0]; 17 18 int tail; 19 20 void insert(char ss[]) 21 { 22 int len,i,j; 23 Tree* p; 24 len = strlen(ss); 25 p = root; 26 for(i=0;i<len;i++) 27 { 28 j = ss[i] - '0'; 29 if(p->next[j]==0) 30 { 31 p->next[j] = &node[tail]; 32 tail++; 33 } 34 p = p->next[j]; 35 if(p->val==1) flag = true; 36 } 37 p->val = 1; 38 for(i=0; i<10; i++) 39 if(p->next[i]) 40 flag = true; 41 } 42 43 int main(void) 44 { 45 int t,n; 46 char s[12]; 47 for(scanf("%d",&t);t--;) 48 { 49 flag = false; 50 tail = 1; 51 for(scanf("%d",&n);n--;) 52 { 53 scanf("%s",s); 54 if(!flag) 55 insert(s); 56 } 57 if(flag) printf("NO\n"); 58 else printf("YES\n"); 59 } 60 return 0; 61 }