知道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;
}