奶牛異或(01字典樹)

2021-10-10 02:29:58 字數 1222 閱讀 1454

題意:

讓你找乙個連續區間異或和最大,如果有相同的,則輸出斷點較小的。

題解:01字典樹,利用字首和的思想進行求解,我們在插入字首的同時,也在不斷的更新最大值。

我們查詢當前 二進位制字串與已經插入的 二進位制字串中的哪乙個異或和最大?

找到最大的那個,讀取這個字首和是到誰結束的,來判斷是否要更新

/*keep on going never give up*/

//#pragma gcc optimize(3,"ofast","inline")

#include

//#define int long long

#define endl '\n'

#define accepted 0

#define ak main()

#define i_can signed

using

namespace std;

const

int maxn =

1e7+10;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const ll mod=

1e9+7;

using

namespace std;

int n,total;

int trie[maxn][2

],num[maxn]

;void

ins(

int val,

int x)

node=trie[node]

[t];

} num[node]

=x;}

pair<

int,

int>

quer

(int val)

else node=trie[node]

[t];

}return

make_pair

(res,num[node]);

}signed

main()

} cout<" "<1<<

" "

}

01字典樹 之 求樹上最長異或路徑

題目描述 給定一棵 n 個點的帶權樹,結點下標從 1 開始到 n 尋找樹中找兩個結點,求最長的異或路徑。異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。洛谷 4551 最長異或路徑 思路,首先dfs處理出每個點到 根 的距離 然後將這些距離存在字典樹中,然後對於每個距離查詢字典樹,得到最優值...

COJ 1216 異或最大值 01字典樹

題意 求n個非負數中任意2個的異或值的最大值。n數量級為10 5 分析 直接暴力肯定超時了。乙個非負整數可以看成1個32位的01字串,n個數可以看成n個字串,因此可以建立字典樹,建好樹後,對於任意非負整數x,可以沿著樹根往下貪心找到y,使得x異或y最大,複雜度為樹的深度。view code incl...

初試01字典樹(求異或問題)

題目鏈結 一般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 在查詢最大異或值時我...