您的位置:首页 > 其它

hdu1671Phone List(字典树---判断有无相同的前缀单词)

2013-08-07 20:09 393 查看
1.题目链接:

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

 

2.参考代码:

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct node{
int cnt;
node* next[10];
node(){
cnt=0;
memset(next,0,sizeof(next));
}
};

node* root=new node;

void build(char* s){
node* p=root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(!p->next[s[i]-'0'])
p->next[s[i]-'0']=new node;
p=p->next[s[i]-'0'];
p->cnt++;
}
}

int find(char* s){
node* p=root;
int len=strlen(s);
for(int i=0;i<len;i++)
p=p->next[s[i]-'0'];
return p->cnt;
}

void freedom(node* p){
for(int i=0;i<10;i++)
{
if(p->next[i])
freedom(p->next[i]);
}
free(p);
}

int main()
{
int t,n,i;
char str[10001][30];
scanf("%d",&t);
while(t--)
{
root=new node;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
build(str[i]);
}
int flag=0;
for(i=0;i<n;i++)
{
if(find(str[i])!=1)   ///一旦有一个访问超过一次就说明不可能
{
flag=0;
break;
}
flag=1;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
freedom(root);
}
return 0;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字典树