題目鏈接: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;
}