hdu 1671 Phone List(字典树)
知道bug的时候我眼泪掉下来。。。
我的第一道字典树,看了字典树的注意事项和实现方式,我写这道题的时候格外认真,就是奔着1A去的。结果这是几A来着?
第一遍写的时候提交MLA,我看了一下,是因为我释放内存的函数写的有问题,‘==’写成了‘=’。修改之后提交wa,这个我就想不明白了,我可是测试了很多组数据的。
之后又尝试性的做了一个小小地修改,再次提交还是wa。然后是各种思考bug,想了好久突然想到我是用数字输入的,这样的话前导0会被忽略掉。
我的1A就这么没了。
#include<stdio.h> #include<string.h> #include<malloc.h> #define N 15 struct node { node* a[10]; int flag; }; node *root; int InsertTree(char *ss) { int k,mark[15]; int ln; ln=strlen(ss); k=0; int i; for(i=ln-1;i>=0;i--) mark[k++]=ss[i]-'0'; node *cur=root; node *s; int flag=0; for(i=k-1;i>=0;i--) { if(i!=0) { if(cur->flag==1) { flag=1; break; } if(cur->a[mark[i]]!=NULL&&cur->a[mark[i]]->flag!=1) cur=cur->a[mark[i]]; else if(cur->a[mark[i]]!=NULL&&cur->a[mark[i]]->flag==1) { flag=1; break; } else { s=(node *)malloc(sizeof(node)); memset(s->a,0,sizeof(s->a)); cur->a[mark[i]]=s; s->flag=0; cur=s; } } else { if(cur->a[mark[i]]!=NULL) { flag=1; break; } else { s=(node *)malloc(sizeof(node)); memset(s->a,0,sizeof(s->a)); cur->a[mark[i]]=s; s->flag=1; cur=s; } } } return flag; } void Free(node *root) { if(root->flag==1) free(root); else { int i; for(i=0;i<=9;i++) { if(root->a[i]!=NULL) Free(root->a[i]); } free(root); } return ; } int main() { int T; scanf("%d",&T); char s[15]; while(T--) { int n; scanf("%d",&n); getchar(); root=(node *)malloc(sizeof(node)); memset(root->a,0,sizeof(root->a)); root->flag=0; int flag=0; while(n--) { int x; gets(s); if(InsertTree(s)) flag=1; } if(flag) printf("NO\n"); else printf("YES\n"); Free(root); } return 0; }