先按长度从大到小排序。
然后判断短的是不是长的的前缀就好。
注意要回收内存
第二篇为静态分配内存。。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
struct node *br[10];
int num;
};
node *root;
void Trie_init()
{
root=new node;
root->num=0;
for(int i=0;i<10;i++)root->br[i]=NULL;
}
void Trie_insert(char str[])
{
int len=strlen(str);
node *s=root;
for(int i=0;i<len;i++)
{
int id=str[i]-'0';
if(s->br[id]==NULL)
{
node *t=new node;
for(int j=0;j<10;j++)t->br[j]=NULL;
t->num=0;
s->br[id]=t;
}
s=s->br[id];
s->num++;
}
}
int Trie_find(char str[])
{
int len=strlen(str);
node *s;
s=root;
int res;
for(int i=0;i<len;i++)
{
int id=str[i]-'0';
if(s->br[id]==NULL)return 0;
else
{
s=s->br[id];
res=s->num;
}
}
return res;
}
void Trie_del(node *p)
{
for(int i=0;i<10;i++)
{
if(p->br[i]!=NULL)
Trie_del(p->br[i]);
}
free(p);
}
struct t
{
char str[12];
int len;
bool operator < (const t &cmp)const
{
return len>cmp.len;
}
}save[10005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Trie_init();
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",save[i].str);
save[i].len=strlen(save[i].str);
}
sort(save+1,save+1+n);
bool flg=true;
for(int i=1;i<=n;i++)
{
if(Trie_find(save[i].str)){flg=false;break;}
else Trie_insert(save[i].str);
}
if(flg)printf("YES\n");
else printf("NO\n");
Trie_del(root);
}
return 0;
}
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
struct node *br[10];
int num;
};
node trid[100000];
node *root;
int cnt;
void Trie_init()
{
cnt=0;
root=new node;
root->num=0;
for(int i=0;i<10;i++)root->br[i]=NULL;
}
void Trie_insert(char str[])
{
int len=strlen(str);
node *s=root;
for(int i=0;i<len;i++)
{
int id=str[i]-'0';
if(s->br[id]==NULL)
{
node *t=&trid[cnt++];
for(int j=0;j<10;j++)t->br[j]=NULL;
t->num=0;
s->br[id]=t;
}
s=s->br[id];
s->num++;
}
}
int Trie_find(char str[])
{
int len=strlen(str);
node *s;
s=root;
int res;
for(int i=0;i<len;i++)
{
int id=str[i]-'0';
if(s->br[id]==NULL)return 0;
else
{
s=s->br[id];
res=s->num;
}
}
return res;
}
struct t
{
char str[12];
int len;
bool operator < (const t &cmp)const
{
return len>cmp.len;
}
}save[10005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Trie_init();
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",save[i].str);
save[i].len=strlen(save[i].str);
}
sort(save+1,save+1+n);
bool flg=true;
for(int i=1;i<=n;i++)
{
if(Trie_find(save[i].str)){flg=false;break;}
else Trie_insert(save[i].str);
}
if(flg)printf("YES\n");
else printf("NO\n");
}
return 0;
}