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;
}

你可能感兴趣的:(poj)