2018.10.5 Trie封裝(第一次寫Trie樹)
阿新 • • 發佈:2018-12-13
**
2018.10.5
** 今天比賽打炸,想了一個不太正確的做法,然後hash不會寫,試著去寫Trie數,還作死地試著寫成資料結構,結構寫了一個上午 程式碼如下:(這是沒有封裝的)
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 100007;
bool brk[32];
struct trie{
struct tedge{
bool a;
tedge *nxt, *to;
tedge(){
nxt = to = NULL;
}
};
int cnt;
tedge *hd;
tedge *fst[32];
trie(){
cnt = 0;
hd = NULL;
for(int i=0; i<32; ++i) fst[i] = NULL;
}
tedge *getnew(){
tedge *a = new tedge;
return a;
}
} thet;
void broke(int x,bool *w){
for(int i=0; i<32; ++i){
w[i] = x & 1;
x >>= 1;
}
}
void add (int val,int dpth,trie *x,trie::tedge *itr){
trie::tedge *itr2;
itr2 = (*x).getnew();
(*x).fst[dpth] = itr2;
(*itr).to = itr2;
(*itr2).a = val;
}
bool find(int x,void func(int,int,trie*,trie::tedge*)=NULL){
broke(x,brk);
int i, j;
bool *k;
trie::tedge *itr = thet.hd;
// tnode itr;
for( i=31; i>=0; --i){
itr = (*itr).to;
if( itr == NULL ){
if( func==NULL ) return false;
(*func)(brk[i],i,&thet,itr);
}
else{
k = & (*((*itr).to)).a;
if( *k != brk[i] ){
itr = (*itr).nxt;
if( itr == NULL ) {
if( func==NULL ) return false;
(*func)(brk[i],i,&thet,itr);
}
}
itr = (*itr).to;
}
}
return true;
}
int main(){
int n, a[N];
int i, j;
scanf("%d", &n);
for( i=1; i<=n; ++i){
scanf("%d", a+i);
find(a[i],add);
}
return 0;
}