Xor Sum (01字典樹)基礎的字典樹題目

2021-08-10 08:45:48 字數 1570 閱讀 1215

初學字典樹的可以拿這道題練練手。

題目大意:給你n個數,有m次詢問,每次給個數,問:這個數與n個數中的哪個數的異或值最大,輸出它。

#include 

#include

#include

using

namespace

std;

//typedef __int64 ll;

typedef

long

long ll;

const

int m = 55;

const

int n = m*1e5;

struct node

} node[n];

int p;

ll a, t[m];

void insert (int& root, int d, ll u)

if (d == -1)

if (u & t[d])

insert(node[root].r, d - 1, u);

else

insert(node[root].l, d - 1, u);

}void query(int root, int d, ll u)

if (((u & t[d]) && node[root].l != -1) || node[root].r == -1)

query(node[root].l, d - 1, u);

else

query(node[root].r, d - 1, u);

}int main ()

printf("case #%d:\n", i);

for (int j = 0; j < m; j++)

}return

0;}

2。指標的寫法:

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

ll a,wei[56];

struct node

};void build(node *head,int f)

if(a&wei[f])

build(head->right,f-1);

}else

build(head->left,f-1);

}}void query(node *head,ll f)

//printf(" fjhd\n");

if(((a&wei[f])&&head->l==1)||head->r==0)

query(head->left,f-1);

else query(head->right,f-1);

}int main()

printf("case #%d:\n",tt++);

for(int i=0; iscanf("%lld",&a);

query(head,50);}}

return

0;}

01字典樹 小結

為了做13年南京網路賽的一道題 學了這個01字典樹 看了別人的模板 之後切了幾道水題 現在總結一下 01字典樹的實現可以看成是把乙個數的二進位制字元化後插入到一顆一般的字典樹中 比如在01字典樹種插入3時 相當於在字典樹中插入00 00011 一共33為,這個根據具體實現不同 查詢最大異或值的時候我...

01字典樹 OR問題

01字典樹 用途 解決區間異或和之類的問題 異或的性質 1.交換律 2.結合律,即 a b c a b c 3.自反性,即x x 0 4.x 0 x 有上述性質,對於區間異或和要知道此性質xor l,r xor 1,l 1 xor 1,r 注意 int型別1 31會溢位 區間異或和的題目 比如給一組...

01字典樹模板

題意 輸入n n次操作 x 插入x x 刪除x x 查詢已經插入的某個數與x異或的最大異或和思路 01字典樹模板題 遇到這題剛好可以更新一下自己的模板 以前的太醜了 ps 這題有個坑點是字典樹為空的情況下可能會查詢,所以開始的時候先插入乙個0 code include using namespace...