Trie字典树例题

本文通过两个例子介绍如何使用Trie树解决最大异或对的问题,包括AcWing 143. 最大异或对和1414. 牛异或题目,强调了高位优先的贪心策略和如何在Trie树中查找连续子序列以最大化异或和。
摘要由CSDN通过智能技术生成

前几天做了个Trie树的题,正好记一下。


首先先看一个简单题

AcWing 143. 最大异或对
题目
在给定的N个整数A1,A2……AN中选出两个进行 xor(异或)运算,得到的结果最大是多少?
第一行输入一个整数N。
第二行输入N个整数A1~AN。
输出一个整数表示答案。
1 ≤ N ≤ 1 0 5 , 0 ≤ A i < 2 3 1 1≤N≤10^5, 0≤A_i<2^31 1N105,0Ai<231

Solution
这个题看数据范围应该是O(nlogn)级别内的,先看暴力做法就是枚举Ai和Aj,这样是O(n^2)的,妥妥的TLE。然后看第一维Ai肯定要保留,只有优化第二维Aj了。
要求两个数异或最大,肯定要越高位越大越好,根据这个贪心的思想,就可以套上Trie了(生硬)。
这里的son数组:son[s][0/1]表示s层0/1结点的子结点在son数组中的下标。

/**
 * AcWing 143. 最大异或对
 * https://www.acwing.com/problem/content/145/
 */
#include <iostream>

using namespace std;
const int N = 100010, M = 3000000;

int n, a[N];
int son[M][2], idx
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值