题意:
给你n个号码,要你判断是否存在某个号码是另外一个号码的前缀,如果是就输出NO,不是的话就输出YES。
题解:
字典树,在进行字典树插入操作的时候判断该节点是否有个号码存在了或者判断跑完整个号码发现还有树枝,说明存在前缀。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int cnt;
node *next[10];
node(){
cnt=0;
for(int i=0;i<10;i++)
next[i]=0;
}
}*root;
bool flag;
void insert(char *s)
{
node *r=root;
for(int i=0;s[i];i++)
{
int x=s[i]-'0';
if(r->next[x]==0) r->next[x]=new(node);
else
{
if(r->next[x]->cnt||i==strlen(s)-1)
{
flag=true;
}
}
r=r->next[x];
}
r->cnt=1;
}
void del(node *head)
{
for(int i=0;i<10;i++)
if(head->next[i])
del(head->next[i]);
delete(head);
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
root=new(node);
flag=false;
scanf("%d",&n);
char s[15];
for(int i=0;i<n;i++)
{
scanf("%s",s);
if(!flag)
insert(s);
}
if(flag)
printf("NO\n");
else
printf("YES\n");
del(root);
}
}