HDU1671-trie树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1671-trie树相关的知识,希望对你有一定的参考价值。

逼格最高的程序。。但是由于是动态开辟,POJ上超时了,HDU过了,不知道为什么。
trie树很简单,没什么说的。
附标程:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 char num[100];
 8 struct sontype{int sonnum,sonplace;};
 9 struct node{
10        vector <sontype> son;
11        int freq;
12        bool endflag;
13 };
14 vector <sontype> mynull;
15 vector <node> E;
16 int root=0;
17 bool f;
18 
19 bool trie_insert(char *a){
20                  int now=root,l=0;
21                  while(l<strlen(a)){
22                                     int tmp=(a[l]-0);
23                                     bool flag=false;
24                                     for(int i=0;i<E[now].son.size();i++){
25                                             sontype t1=E[now].son[i];
26                                             if(t1.sonnum==tmp){
27                                                                E[t1.sonplace].freq++;
28                                                                now=t1.sonplace;
29                                                                flag=true;
30                                                                break;
31                                             }
32                                     }
33                                     if(!flag){
34                                               E[now].son.push_back((sontype){tmp,E.size()});
35                                               now=E.size();
36                                               E.push_back((node){mynull,1,0});
37                                     }
38                                     l++;
39                                     if(l==strlen(a)){
40                                                      E[now].endflag=1;
41                                                      if(E[now].freq>1) return false;
42                                     }
43                                     else{if(E[now].endflag) return false;}
44                  }
45                  return true;
46 }
47 void trie_clear(){
48      f=false;root=0;
49      E.clear();
50      E.push_back((node){mynull,0,0});      
51 }                                       
52                                               
53                                                                     
54                  
55 int main(){
56     int t,n;
57     scanf("%d",&t);
58     while(t--){
59                trie_clear();
60                scanf("%d",&n);
61                for(int i=0;i<n;i++){
62                        scanf("%s",num);
63                        if(!trie_insert(num)) f=true;
64                }
65                printf(f?"NO\n":"YES\n");
66     }
67     
68     return 0;
69 }

 

以上是关于HDU1671-trie树的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1251 统计难题(字典树)

统计难题HDU - 1251map打表或字典树字典树模板

代码源 Div1 - 108#464. 数数(主席树,区间比k小的数的个数)HDU4417

hdu 6287 口算训练(可持久化线段树+线性筛)

Treap树模板hdu-4585

hdu-1540线段树刷题