http://acm.hdu.edu.cn/showproblem.php?pid=1671
简单的字典树 注意每次要释放内存 不然会MLE
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
struct node
{
int sign;
node *next[10];
node()
{
memset(next,NULL,sizeof(next));
sign=0;
}
};
struct number
{
string num;
}a[10001];
bool cmp(number a, number b)
{
return a.num.size()<b.num.size();
}
node *root = new node();
int insert(string s)
{
node *p = root;
int len = s.size();
for(int i = 0; i<len; i++)
{
int k = s[i]-'0';
if(p->next[k]==NULL)
p->next[k]=new node();
if(p->sign)
return 1;
p=p->next[k];
}
p->sign=1;
return 0;
}
void del(node *p)
{
for(int i = 0; i<10; i++)
if(p->next[i]!=NULL)
del(p->next[i]);
delete p;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
root = new node();
int flag=1;
cin>>n;
for(int i = 0; i<n; i++)
cin>>a[i].num;
sort(a,a+n,cmp);
for(int i = 0; i<n&&flag; i++)
if(insert(a[i].num))
flag=0;
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
del(root);
}
}