当前位置: 首页 > news >正文

网站建设 时间安排搜外友链

网站建设 时间安排,搜外友链,建设一个机械公司网站多少钱,上海微信小程序网站建设什么是 01Trie? 01Trie是字典树的一种变种,其只有两种情况,即 0 和 1,实现方式其实和字典树是一样的 有什么用呢? 其一般用于解决异或问题,是一种快速的数据结构,某些情况下可以无脑套用 实现方式&#…

什么是 01Trie?

01Trie是字典树的一种变种,其只有两种情况,即 0 和 1,实现方式其实和字典树是一样的


有什么用呢?

其一般用于解决异或问题,是一种快速的数据结构,某些情况下可以无脑套用


实现方式?

和上面说的一样,其实就是字典树,我们利用实战来讲解一下


实战运用!

P10471 最大异或对 The XOR Largest Pair - 洛谷

思路:

板子

由于要让我们选择两个数使得异或和最大,如果我们直接双重循环的话指定会爆,那我们就需要优化了,而这时就可以请出我们的01Trie了,倒不如说这就是为它而生的

对于01Trie我们必备的两个操作就是插入和查询,我们先讲解插入

我们定义 ch[][] 数组为整个01Trie的大小,由于每个数都有31位,且每位都有01两种可能,所以数组大小就是 ch[N*31][2],同时我们再定义一个 idx,其代表当前已经有了多少个节点,其中 ch[p][j]代表的是节点 p 到 j 是否存在一条边,且这条边的另一个点是谁,这样我们就能每次跳到下一个节点了,如果不存在我们就只需要把它变成新的节点即可

那么对于每次插入操作,我们都从高到低插入(之后会说为什么),然后判断是否存在这条边,如果存在那就跳到下一个节点,否则就赋予新的节点再跳

查询操作也很好写了,我们和上面插入操作类似,只不过这次我们要主动跳跃了,我们判断 x 的当前位是什么,如果是 0,那我们就判断此点与 1 是否有边,如果有那就跳,否则就跳 0,如果是 1 也是同理,那为什么要从最高位开始呢?因为如果对于 0 最高位有 1 的话,那我们跳到 1 即可,因为此后即使全是 1 也不可能比此时选 1 大,如 1000 0111

那么按照上面思路写完就结束了

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlconst int N = 100010;
int n, a[N];
int ch[N * 31][2], idx = 0;void insert(int x)
{int p = 0;for (int i = 30; i >= 0; i--){int j = x >> i & 1;if (!ch[p][j]){ch[p][j] = ++idx;}p = ch[p][j];}
}int query(int x)
{int p = 0, res = 0;for (int i = 30; i >= 0; i--){int j = x >> i & 1;if (ch[p][!j]){res += 1 << i;p = ch[p][!j];}else{p = ch[p][j];}}return res;
}void solve()
{cin >> n;for (int i = 0; i < n; i++){cin >> a[i];insert(a[i]);}int ans = 0;for (int i = 0; i < n; i++){ans = max(ans, query(a[i]));}cout << ans;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P4551 最长异或路径 - 洛谷

思路:

思维题

这题乍一看根本不知道怎么和01Trie扯上关系,但是我们要仔细分析一下

对于这棵树,我们随便以一点为根,这里以 1 为根,那么我们可以计算出每个点 x 到 1 的异或和val(1,x)是多少,一次 dfs 即可,那么知道这个有什么用呢?

对于 u v 两个点,如果我们要计算 u ~ v 的异或和,由于异或有交换律,所以我们不需要考虑顺序,那么 val(u,v) = val(1,u) ^ val(1,v),为什么呢?显然我们可以以 v 为一个中转站,然后链接 u v,如果其中有重复的路,由于 x ^ x = 0,所以重复的位置不会对答案造成影响,因此是可以这样的

所以题目就可以这样做:先 dfs 跑一边把 a[i] 求出来,然后将所有的 a[i] 加到 01Trie 中,然后跑一遍模板即可

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
const int N = 100010;
int n;
int ch[N * 31][2],idx = 0;
vector<vector<pair<int, int>>> g(N);
vector<int> a(N);void insert(int x)
{int p = 0;for (int i = 30; i >= 0; i--){int j = x >> i & 1;if (!ch[p][j]){ch[p][j] = ++idx;}p = ch[p][j];}
}int query(int x)
{int p = 0,res = 0;for (int i = 30; i >= 0; i--){int j = x >> i & 1;if (ch[p][!j]){res += 1LL << i;p = ch[p][!j];}else{p = ch[p][j];}}return res;
}void dfs(int self,int fa)
{for (auto son : g[self]){if (son.first == fa){continue;}a[son.first] = a[self] ^ son.second;dfs(son.first, self);}
}void solve()
{cin >> n;for (int i = 0; i < n - 1; i++){int u, v, x;cin >> u >> v >> x;g[u].push_back({ v,x });g[v].push_back({ u,x });}dfs(1, 1);for (int i = 1; i <= n; i++){insert(a[i]);}int ans = 0;for (int i = 1; i <= n; i++){ans = max(ans, query(a[i]));}cout << ans;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

http://www.cadmedia.cn/news/4520.html

相关文章:

  • 电商扶贫网站建设服务器域名怎么注册
  • 龙泉驿区疫情最新消息整站关键词排名优化
  • 中小企业网站建设客户需求调查问卷南宁seo排名优化
  • 在什么网站可以接活做seo推广软件代理
  • 六安建设局网站香飘飘奶茶软文
  • 做企业网站通常哪找素材电子商务网站建设与管理
  • 正规免费发布信息网站关键词搜索量排名
  • 如何上传织梦做的网站注册一个公司网站需要多少钱
  • 江西南昌电子商务网站建设公司市场调查报告模板及范文
  • 惠州网站建设惠州推推蛙seo顾问
  • 泊头哪里有做网站的嘉兴网站建设
  • 代做网站灰色关键词百度站长统计工具
  • 长春自主建站模板上海专业的seo推广咨询电话
  • 沧州网站推广优化商集客电话国内可访问的海外网站和应用
  • 公司网站欢迎语线上宣传的方式
  • 太原站建设有多长时间不限制内容的搜索引擎
  • php网站开发流程图怎么做推广和宣传平台
  • web网站建设报价女排联赛最新排行榜
  • 通辽企业网站建设友情链接页面
  • 长春网站建设外包百度网站流量查询
  • 深圳网站建设公司市场引擎优化搜索
  • 学习网页设计网站制作什么是网络营销战略
  • 如何建设网站与域名宁波网络推广公司有哪些
  • 非小号是根据国外哪个网站做的seo优化网页
  • 做网站用哪个软件免费发布信息平台有哪些
  • 图片生成器下载短视频入口seo
  • 家装要去哪个公司装修青岛seo网站推广
  • 化妆品品牌网站建设seo站长常用工具
  • 个人网站模板html代码市场推广是做什么的
  • 广告行业网站建设方案搜狗搜图