您的位置:首页 > 其它

hdu1671 Phone List (字典树)

2013-08-17 11:53 459 查看
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1671

 题解:判断字符串是否存在前缀,字典树(静态字典树)

#include <stdio.h>
#include <string.h>
#define MAXN 100002

int child[MAXN][10];//child[i][j]=0说明没有对应的节点,以i为根节点的子树,
int flag[MAXN];//表示节点i是否为一个号码的结尾
int tot,root;

void Trie()
{
memset(child[0],0,sizeof(child[0]));
flag[0]=0;
tot=root=0;//根节点为0
}

int inset(char *str)
{
int *cur=&root,ans=0;
char *ptr;
for(ptr=str;*ptr;++ptr)
{
cur=&child[*cur][*ptr-'0'];
if(*cur==0)
{
*cur=++tot;
ans=1;
memset(child[tot],0,sizeof(child[tot]));
flag[tot]=0;
}
if(flag[*cur]==1)
return 0;
}
flag[*cur]=1;
return ans;
}

int main()
{
char phone[12];
int i,ans,test,n;
scanf("%d",&test);
while(test--)
{
Trie();
ans=1;
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%s",phone);
if(ans)
ans=inset(phone);
}
if(ans)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: