http://acm.hdu.edu.cn/showproblem.php?pid=1671
2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
NO YES
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct ac //节点结构体 { int v; struct ac *child[11]; }tree; tree *root; //头节点,不存任何值 int flag; void add(char *p) { int i,j,l=strlen(p); tree *a=root,*b; for(i=0;i<l;i++) //每个单词占一层
{ int k=p[i]-'0'; if(a->child[k]!=0) { a=a->child[k]; if(a->v==1) // 遍历到一个前缀 { flag=1; break; } } else { b=(tree *)malloc(sizeof(tree)); for(j=0;j<=9;j++) b->child[j]=0; a->child[k]=b; a=b; } } a->v=1; //每个单词最后一位标记为1. for(i=0;i<=9;i++)//若该单词最后一位存在下一个节点与之相连,则该单词为前缀 { if(a->child[i]!=0) { flag=1; return ; } } } void clear(tree * p) //释放内存,该题无此函数mle { if(p==NULL) return ; else { for(int i=0;i<=9;i++) clear(p->child[i]); } free(p); } int main() { int t; scanf("%d",&t); while(t--) { flag=0; root=(tree *)malloc(sizeof(tree)); int i,n; for(i=0;i<=9;i++) root->child[i]=0; root->v=0; char s[12]; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%s",s); add(s); } if(flag) printf("NO\n"); else printf("YES\n"); clear(root); } return 0; }