HDU 1671 字典树+释放内存

先解释题意:给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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值