题意:给定一组电话号码,判断是否有一个号码是其他号码的前缀,如果是,输出YES,否则NO。 字典树,在insert的过程中同时判断,然后返回该值。 #include<iostream> #include<algorithm> using namespace std; struct Node { Node*next[10]; bool end; Node() { end=false; for(int i=0;i<10;i++) next[i]=NULL; } }*root,node[10010*20]; int top; bool insert(char s[]) { bool flag=false; Node*temp=root; int i,l=strlen(s); for(i=0;i<l;i++) { if(!temp->next[s[i]-'0']) temp->next[s[i]-'0']=&node[top++]; if(temp->end==true) flag=true; temp=temp->next[s[i]-'0']; } temp->end=true; return flag; } struct Word { char s[10]; }word[10010]; bool operator <(const Word a,const Word b) { return strcmp(a.s,b.s)<0; } int main() { int test,i,j,n; bool flag; scanf("%d",&test); while(test--) { for(i=0;i<top;i++) { node[i].end=false; for(j=0;j<10;j++) node[i].next[j]=NULL; } flag=false; root=&node[0]; top=1; scanf("%d",&n); for(i=0;i<n;i++) scanf("%s",word[i].s); sort(word,word+n); for(i=0;i<n;i++) { if(insert(word[i].s)) { flag=true; break; } } if(flag) printf("NO/n"); else printf("YES/n"); } return 0; }