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 10005char 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;}


你可能感兴趣的:(ACM_HDU)