Description
We know that if a phone number A is another phone number B’s prefix, B is not able to be called. For an example, A is 123 while B is 12345, after pressing 123, we call A, and not able to call B. Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.
Input
The input consists of several test cases. The first line of input in each test case contains one integer N (0 < N < 1001), represent the number of phone numbers. The next line contains N integers, describing the phone numbers. The last case is followed by a line containing one zero.
Output
For each test case, if there exits a phone number that cannot be called, print “NO”, otherwise print “YES” instead.
Sample Input
2 012 012345 2 12 012345 0
Sample Output
NO YES
思路分析:字典树。
代码:#include<stdio.h> #include<stdlib.h> struct node { int flag; struct node *next[10]; }*root; int tag; struct node *creat() { struct node *p; p=(struct node *)malloc(sizeof(struct node)); p->flag=0; for(int i=0;i<10;i++) p->next[i]=NULL; return p; } void inser(char *s) { int i; struct node *p; p=root; for(i=0;s[i]!='\0';i++) { if(!(p->next[s[i]-'0'])) p->next[s[i]-'0']=creat(); p=p->next[s[i]-'0']; if(p->flag==1) tag=1;//判断p节点是否是某字符串的结束。 } p->flag=1; } int main () { int t; char s[1010]; while(~scanf("%d",&t)) { if(!t) break; root=creat(); tag=0; while(t--) { scanf("%s",s); inser(s); } if(tag==1) printf("NO\n"); else printf("YES\n"); } return 0; }