字典樹與01字典樹
阿新 • • 發佈:2018-05-25
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字典樹