HDU-1671-Phone List

HDU-1671-Phone List

http://acm.hdu.edu.cn/showproblem.php?pid=1671

字典树,判断是否有某个数字是另一个数字的前缀,注意123不是123的前缀,建树之后要删除节点,否则会Memory LimitExceeded

写的比较麻烦,分两种情况,一是先出现123,再出现1234,;二是先出现1234,再出现123

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define N 10005
char str[N];
struct node
{
	int count;
	node *childs[10];
	node()
	{
		count=0;
		int i;
		for(i=0;i<=9;i++)
		childs[i]=NULL;
	}
};
node *root,*current,*newnode;
int flag;
void del(node *head)  
{
	int i;
	for(i=0;i<=9;i++)
	if(head->childs[i]!=NULL)
	del(head->childs[i]);
	delete(head);
}
int judge(node *head)
{
	int i;
	for(i=0;i<=9;i++)
	if(head->childs[i]!=NULL)
	return 1;
	return 0;
}
void insert(char *str)
{
	int i,m;
	current=root;
	for(i=0;i<strlen(str);i++)
	{
		m=str[i]-'0';
		if(current->childs[m]!=NULL)
		{
			current=current->childs[m];
			if((i<strlen(str)-1&¤t->count==1)||(i==strlen(str)-1&&judge(current)))  
			{
				flag=1;
				break;
			}
		}
		else
		{
			newnode=new node;
			current->childs[m]=newnode;
			current=newnode;
		}
	}
	current->count=1;
}
int main()
{
	int t,i,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		flag=0;
		root=new node;
		while(n--)
		{
			scanf("%s",str);
			if(flag==1)
			continue;
			insert(str);
		}
		if(flag)
		printf("NO\n");
		else
		printf("YES\n");
		del(root);
	}
	return 0;
}


你可能感兴趣的:(struct,list,null,delete,insert)