题意
给你n个字符串问你在这些字符串中是否存在一个字符串是其他字符串的前缀
思路
字典树求前缀,注意指针字典树要释放内存。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct Trie{
int cont;
Trie *next[11];
Trie()
{
cont=0;
memset(next,NULL,sizeof(next));
}
}*root;
void Insert(char str[])
{
int len=strlen(str);
Trie *p= root;
for(int i=0;i<len;i++)
{
int k=str[i]-'0';
if(p->next[k]==NULL)
{
p->next[k]=new Trie();
}
p=p->next[k];
p->cont++;
}
}
bool Query(char str[])
{
int len=strlen(str);
Trie *p=root;
for(int i=0;i<len;i++)
{
int k=str[i]-'0';
p=p->next[k];
}
// int k=p->cont;
// printf("%d\n",k);
if(p->cont>1) return true;
else return false;
}
void Free(Trie* T)
{
if(T == NULL) return;
// 释放trie树的每一个节点占用的内存
for(int i=0; i<11; ++i)
{
if(T->next[i]) Free(T->next[i]);
}
delete(T);
}
char str[10011][20];
int main()
{
int T;cin>>T;
while(T--)
{
root =new Trie();
int n;
cin>>n;
memset(str,0,sizeof(str));
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
Insert(str[i]);
}
int fg=0;
for(int i=0;i<n;i++)
{
if(Query(str[i]))
{
fg=1;
break;
}
}
if(fg) printf("NO\n");
else printf("YES\n");
Free(root);
}
return 0;
}