题目连接: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;
}