1. 问题背景与核心需求
基因治疗领域的研究中,医生们经常需要评估不同基因组合的治疗效果。在这个问题中,我们面对的是一个典型的博弈论场景:两位医生小蓝和小乔需要从n个候选基因中各选一个进行组合评估,组合效果由两个基因特性数值的异或结果决定。
异或运算(XOR)是一种二进制位运算,当两个对应位不同时结果为1,相同时为0。例如:5(101)⊕3(011)=6(110)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 01字典树的核心原理
2.1 数据结构设计
01字典树是一种特殊的二叉树结构,专门用于处理二进制数的存储和查询。每个节点包含:
- 两个子节点指针(对应0和1)
- 计数器(记录经过该节点的数字数量)
cpp复制class C2BNumTrieNode {
public:
C2BNumTrieNode* m_childs[2]; // 0和1分支
int m_iNum = 0; // 经过该节点的数字数量
};
2.2 关键操作实现
2.2.1 插入操作
从最高位开始,按二进制位逐层构建树结构:
cpp复制void Add(T iNum) {
C2BNumTrieNode* p = m_pRoot;
for(int i=iLeveCount-1; i>=0; i--) {
p->m_iNum++;
bool bRight = iNum & ((T)1 << i); // 获取当前位
if(!p->m_childs[bRight]) {
p->m_childs[bRight] = new C2BNumTrieNode();
}
p = p->m_childs[bRight];
}
p->m_iNum++;
}
2.2.2 查询最大异或值
利用贪心算法,尽可能选择与当前位相反的路径:
cpp复制T MaxXor(T iNum) {
C2BNumTrieNode* p = m_pRoot;
T iRet = 0;
for(int i=iLeveCount-1; i>=0; i--) {
bool bRight = !
