poj 3630 字典树
只能创建静态树,动态树超时
#include <iostream>
#include <string>
using namespace std;
struct treenode
{
bool color;
treenode *next[10];
treenode()
{
color=false;
memset(next,NULL,sizeof(next));
}
};
treenode tri[100001];
int num;
bool Insert(treenode *root,string str)//可行时反回true
{
bool flg1,flg2;
treenode *p=root;
flg1=true;//假设可行
flg2=false;//假设不可行
for(int i=0;i<str.length();i++)
{
int data=str[i]-'0';
if(p->next[data]==NULL)
{p->next[data]=&tri[++num];flg2=true;}
if(p->color!=true)
;
else
flg1=false;
p=p->next[data];
}
p->color=true;
return flg1&flg2;
}
int main()
{
int t,n,i;
cin>>t;
string str;
char a[10];
while(t--)
{
bool flg=true;//假设可行
num=0;
cin>>n;
treenode *root=&tri[0];
for(i=0;i<n;i++)
{
scanf("%s",a);
str=a;
if(flg&&Insert(root,str))
;
else
flg=false;
}
if(flg)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
for (int i = 0; i <=num; i++)
{
tri[i].color = false;
memset(tri[i].next, NULL, sizeof(tri[i].next));
}
}
return 0;
}