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