您的位置:首页 > 其它

HDU1671 字典树

2016-07-19 19:53 211 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671

大致题意:T组询问,每组给出n个号码,如果该组中出现以其他串为前缀的串就输出“NO",否则输出”YES"。

思路:字典树模板

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

char str[10005];
int n;

struct Trie
{
bool flag;
Trie *nxt[10];
void init()
{
for (int i=0;i<10;i++)
this->nxt[i] = NULL;
flag = false;
}
};

bool ist(Trie *root, char *s)
{
bool flag = false;
Trie *p,*q;
p = root;
int len = strlen(s);
for (int i=0;i<len;i++)
{
int id = s[i]-'0';
if (p->nxt[id]==NULL)
{
q = new Trie;
q->init();
p->nxt[id] = q;
}
else
{
if (p->nxt[id]->flag==true)
flag = true;
}
p = p->nxt[id];
}
p->flag = true;
return flag;
}

bool Search(Trie *root, char *s)
{
Trie *p;
p = root;
int len = strlen(s);
for (int i=0;i<len;i++)
{
int id = s[i]-'0';
if (p->nxt[id]==NULL) return false;
p = p->nxt[id];
}
return true;
}

void del(Trie *root)
{
for (int i=0;i<10;i++)
{
if (root->nxt[i]!=NULL) del(root->nxt[i]);
}
delete(root);
}

int main()
{
int T;
scanf("%d",&T);
while (T--)
{
Trie *root = new Trie;
root->init();
bool flag = true;
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%s",str);
if (Search(root,str)==true) flag = false;
if (ist(root,str)) flag = false;
}
if (flag) puts("YES");
else puts("NO");
del(root);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: