1. 程式人生 > >字典樹與01字典樹

字典樹與01字典樹

max www. 返回 stat for trie iostream 因此 TP


之前在做一道關於字符串匹配的題時,用到了字典樹,但那時是用指針實現的,這次又遇到需要使用字典樹這一結構的題,向學姐要了她的板子,學習了用數組實現的方法,對於解題而言,更為簡短快速。
因為題目要求最大異或和,因此用的是01字典樹,在字典樹的基礎上稍作修改。
以下為字典樹和01字典樹的普遍實現:
字典樹

#include<iostream>
#include<algorithm>
using namespace std; 
struct Trie
{
    static const int N = 101010 , M = 26;
    int node[N][M],cnt[N],root,L; //cnt記錄對應節點的字符串個數 
void init() { fill_n(cnt,N,0); fill_n(node[N-1],M,0); L = 0; root = newnode(); } int newnode() { fill_n(node[L],M,0); return L++; } void add(char *s) { int p = root; for(int i=0;s[i];++i) { int
c = s[i] - ‘a‘; if(!node[p][c]) node[p][c] = newnode(); p = node[p][c]; } ++cnt[p]; } };

01字典樹(可用於求異或和最大問題,long long型開64倍,int型開32倍)

#include<algorithm>
using namespace std;
struct Trie_01
{
    static const int maxn=1e5+10,N = 32*maxn,M = 2
; int node[N][M],value[N],rt,L; //value記錄對應節點的值,用於返回 void init() { fill_n(node[N-1],M,0); fill_n(value,N,0); L = 0; rt = newnode(); } int newnode() { fill_n(node[L],M,0); return L++; } void add(int x) { int p = rt; for (int i=31;i>=0;--i) { int idx = (x>>i)&1; if (!node[p][idx]) { node[p][idx] = newnode(); } p = node[p][idx]; value[p]=min(value[p],x); } } int query(int x) { int p = rt; for (int i=31;i>=0;--i) { int idx = (x>>i)&1; if (node[p][idx^1]) p = node[p][idx^1]; else p = node[p][idx]; } return value[p]; } };

字典樹與01字典樹