题目有个陷阱:我的思路是如果走到了某个字符串的结尾,那就跳出循环!结果光荣WA了。如果这个字符串的结尾被走过了,那么也要跳出!
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
struct node
{
int m;
int v;
node *next[10];
node()
{
for(int i=0;i<10;i++)
next[i]=NULL;
m=0;
}
};
node *root;
int n;
bool s;
void insert_tree(char *map)
{
int len=strlen(map);
if(root==NULL)
{
root=new node;
}
node *p=root,*q;
for(int i=0;i<len;i++)
{
if(p->m==1)
{
s=true;
return;//这是个结尾
}
int id = map[i]-'0';
if(p->next[id]==NULL)
{
q=new node;
p->next[id]=q;
p=p->next[id];
}
else
{
p=p->next[id];
if(i==len-1)
{
s=true;
return;//这也是个结尾
}
}
if(i==len-1)
{
p->m=1;
}
}
}
void del_tree(node *rt)
{
for(int i=0;i<10;i++)
{
if(rt->next[i]!=NULL)
{
del_tree(rt->next[i]);
}
}
delete rt;
}
int main()
{
int t;
char map[11];
scanf("%d",&t);
while(t--)
{
s=false;
root=NULL;
scanf("%d%*c",&n);
while(n--)
{
scanf("%s",map);
if(s)
continue;
else
insert_tree(map);
}
if(s)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
del_tree(root);
}
return 0;
}