#include <stdio.h>
#include <cstring>/**
若A是B的前缀,有两种情况,一是A先建树(短的先建树),二是B先建树 (长的先建树)
*/struct Node
{
int length; //将字符串的长度存到叶子节点
Node *next[10];
Node(){
length = 0;
memset(next, 0, sizeof(next));
}
};Node *root = new Node;
bool Insert(char *s)
{
Node *p = root;
int len = strlen(s), id;
bool flag1 = false;
bool flag2 = false;
for(int i = 0; i < len; i++)
{
id = s[i] - '0';
if(i == len-1 && p->next[id] != 0) //说明长的比短的先建树
flag1 = true;
if(p->next[id] == 0)
{
if(p->length > 0) //说明短的比长的先建树
flag2 = true;
p->next[id] = new Node;
}
p = p->next[id];
}
p->length = len; //将字符串的长度存到叶子节点;
if(flag1 || flag2)
return true;
return false;
}void Del(Node *p)
{
if(p == NULL)
return;
for(int i = 0; i < 10; i++)
if(p->next[i] != NULL)
Del(p->next[i]);
delete p;
}int main()
{
char str[1000];
bool flag = false;
int n, m;
scanf("%d", &n);
while(n--)
{
scanf("%d", &m);
flag = false;
while(m--)
{
scanf("%s", str);
if(!flag)
flag = Insert(str);
}
if(flag)
printf("NO\n");
else
printf("YES\n");
Del(root);
root = new Node;
}
return 0;
}
Phone List HDU - 1671(字典树)
猜你喜欢
转载自blog.csdn.net/mch2869253130/article/details/82219258
今日推荐
周排行