题意:给定n个长度不超过10的电话号码,求是否有电话号码是另一个的前缀。
解法:Trie树,代码能力直线下降啊。。这么简单的好写这么久。
#include <stdio.h>
#include <string.h>
#define N 10005
#define KIND 10
struct TreeNode
{
TreeNode *next[KIND];
}table[N * 10], root;
char data[N][15];
int sp;
void Insert(char *data)
{
TreeNode *r = &root;
for(; *data; data++)
{
int t = *data - '0';
if(NULL == r->next[t])
{
r->next[t] = &table[sp];
memset(table[sp].next, 0, sizeof(table[sp].next));
sp++;
}
r = r->next[t];
}
}
bool Find(char *data)
{
TreeNode *r = &root;
for(; *data; data++)
{
int t = *data - '0';
r = r->next[t];
}
for(int i = 0; i < KIND; i++)
if(r->next[i]) return 1;
return 0;
}
int main()
{
int n, t;
bool flag;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
memset(root.next, 0, sizeof(root.next));
sp = 0;
for(int i = 0; i < n; i++)
{
scanf("%s", &data[i]);
Insert(data[i]);
}
flag = 1;
for(int i = 0; i < n; i++)
{
if(Find(data[i]))
{
flag = 0;
break;
}
}
if(!flag) puts("NO");
else puts("YES");
}
return 0;
}