您的位置:首页 > 其它

hdu1671Phone List(字典树模板)

2017-08-18 13:54 387 查看
题意:

给你n个字符串,判断存不存在任意两个字符串,其中一个是另一个的前缀;

思路:

建立一个Trie树,val是否为1来判断存不存在根节点到当前节点有一个字符串。

遍历到val为1的节点 或者 遍历到末尾时还存在节点时 输出yes。注意释放内存

代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
int flag;
struct trie
{
trie *next[11];
int val;
};
void ins(trie *p,char *str)
{
int len = strlen(str);
int i = 0;
while(i<len)
{
trie *temp;
temp = p->next[str[i]-'0'];
if(i!=len-1)
{
if(temp==NULL)
{
temp = new trie;
temp->val = 0;
for(int j = 0;j<=9;j++)
temp->next[j] = NULL;
p->next[str[i]-'0'] = temp;;
}
else
{
if(temp->val==1)
flag = 1;
}
p = p->next[str[i]-'0'];
}
else
{
if(temp!=NULL)
flag = 1;
else
{
temp = new trie;
temp->val = 1;
for(int j = 0;j<=9;j++)
temp->next[j] = NULL;
p->next[str[i]-'0'] = temp;
}
}
i++;
}
}

void del(trie *p)
{
for(int i = 0;i<=9;i++)
if(p->next[i]!=NULL)
del(p->next[i]);
delete p;
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
flag = 0;
scanf("%d",&n);
getchar();
trie* root = new trie;
root->val = 0;
for(int i = 0;i<=9;i++)
{
root->next[i] = NULL;
}
char phone[11];
for(int i = 0;i<n;i++)
{
scanf("%s",phone);
if(!flag)
ins(root,phone);//插入
}
if(flag)
printf("NO\n");
else
printf("YES\n");
del(root);//释放内存
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: