先解释题意:给T组数据,每组数据有N个电话号码,要求每个电话号码不能是其他电话号码的前缀,若满足要求输出YES 否则输出NO
一开始WA,看了下题解 觉得很复杂........且个人认为可以更简单些。。。。。。。。
于是自己卡了半个小时 AC(这个故事告诉我们 不要总看题解,自己想的也不错,这也是一个ACMer应有的品质吧)
就两个判断就OK了
1.当前串能不能作为其他串的前缀
2.其他串能不能作为当前串的前缀
弄明白这两个基本就可以A了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node;
struct node
{
int num;
int id;
struct node *N[10];
};
struct node *root;
int insert(char *s)
{
int i,j,n,m;
n=strlen(s);
i=0;
struct node *p,*q;
q=root;
while(i<n)
{
if(q->N[s[i]-'0']!=NULL)
{
q=q->N[s[i]-'0'];
}
else
{
p=(struct node *)malloc(sizeof(struct node));
memset(p,NULL,sizeof(struct node));
q->N[s[i]-'0']=p;
q=p;
}
if(q->num==1)//判断之前有没有某个串是该串的前缀
return 1;
i++;
if(i==n) //判断该串是不是之前某个串的前缀
if(q->id==1)
return 1;
q->id=1;
}
if(q->num==1)
return 1;
q->id=1;
q->num=1;
return 0;
}
void del(node *root)
{
for(int i=0;i<10;i++)
if(root->N[i]) del(root->N[i]);
delete(root);
}
int main()
{
int i,j,n,m;
char s[100100];
scanf("%d",&m);
int mark;
while(m--)
{
mark=0;
root=(struct node *)malloc(sizeof(struct node));
memset(root,NULL,sizeof(struct node));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",s);
if(mark==0)
if(insert(s))
{
mark=1;
}
}
if(mark==0)
printf("YES\n");
else
printf("NO\n");
del(root);//释放内存
}
return 0;
}