一道水题:判断有没有前缀。
#include<stdio.h>
#include<string.h>
#define max 100010
struct node
{
bool tem;
struct node *next[12];
node()
{
for(int i=0; i<11; i++)
next[i]=NULL;
}
} Node,Root[max];
int pox=0;
int BuildTree(char *tem)
{
node *st=&Node;
int flag=1;
while(*tem)
{
if(st->next[*tem-'0']==NULL)//flag判断如果前面的字符串大于后面的情况
{
flag=0;
Root[pox].tem=false;
st->next[*tem-'0']=&Root[pox++];
}
st=st->next[*tem-'0'];
++tem;
if(st->tem)//判断前面的字符串长度小于后面的情况
return 1;
}
st->tem=true;
if(flag)
return 1;
return 0;
}
int main()
{
int len;
int i,j;
int flag;
int num;
char phoneNum[20];
scanf("%d",&len);
for(i=0; i<len; i++)
{
memset(Root[0].next,NULL, sizeof(Root[0].next));
memset(Root,0,sizeof(Root));
memset(Node.next,0,sizeof(Node.next));//将st中的next都赋成空 很重要
scanf("%d",&num);
flag=0;
pox=0;
for(j=0; j<num; j++)
{
scanf("%s",phoneNum);
if(flag==0)
flag=BuildTree(phoneNum);
memset(phoneNum,'0',sizeof(phoneNum));
}
// printf("flag=%d\n",flag);
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
/*
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
*/