题意:找单词中看是否存在一个单词是另一个的前缀,静态建树
思路:字典树
单词存在前缀有两种
1.abc存在,我们要查找abcd,那样只要找标记即可,即前缀已经存在。
2.abcd存在,我们要找abc,那样就是插入的单词的结尾在字典树中是存在的,即前缀不存在
所以在插入过程中就判断前缀是否存在
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie
{
bool flag;
struct Trie * next[10];
}Tri[500000];
int alloc = 0;
bool flag = 0;
struct Trie * creat_node()
{
int i;
Trie * p;
p = &Tri[alloc++];
p ->flag = false;
for(i = 0; i < 10; i++)
p -> next[i] = NULL;
return p;
}
void insert(Trie **p, char *str)
{
int i,len;
len = strlen(str);
Trie * q;
q = *p;
for(i = 0; i < len; i++)
{
if(q ->next[str[i]-'0'] != NULL)
{
q = q -> next[str[i]-'0'];
if(q -> flag || i == len -1)
flag =true;
}
else
{
q -> next[str[i]-'0'] = creat_node();
q = q -> next[str[i]-'0'];
}
}
q -> flag = true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int i;flag = false;
Trie * root ;
alloc = 0;
root = creat_node();
for(i = 0; i < n; i++)
{
char c[100];
scanf("%s",c);
insert(&root,c);
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}