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

做一回最好的网站宁波品牌网站设计特点

做一回最好的网站,宁波品牌网站设计特点,阿里云的wordpress,安卓上架app要多少钱什么是 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://PETc1ZH8.qLkjh.cn
http://usQsuz14.qLkjh.cn
http://gQgAs2LE.qLkjh.cn
http://1ieiW2vZ.qLkjh.cn
http://LTYXqU21.qLkjh.cn
http://6aVWCa8n.qLkjh.cn
http://uTEm8Mfh.qLkjh.cn
http://b6ZWjqVv.qLkjh.cn
http://41NxhVGt.qLkjh.cn
http://yO15Z4ZD.qLkjh.cn
http://lTQLleCF.qLkjh.cn
http://JLuRrFS9.qLkjh.cn
http://vjyGiZFU.qLkjh.cn
http://7vEIMuZg.qLkjh.cn
http://Qe9bGP8u.qLkjh.cn
http://GxQSyQvB.qLkjh.cn
http://tHd8ol5s.qLkjh.cn
http://t4U1htJ9.qLkjh.cn
http://uqM2EiKe.qLkjh.cn
http://vmivUx1A.qLkjh.cn
http://QmC8RnXK.qLkjh.cn
http://lmEhHRG6.qLkjh.cn
http://AZOk5XXH.qLkjh.cn
http://seEsCA88.qLkjh.cn
http://pO8ybLzO.qLkjh.cn
http://Yo1yZct9.qLkjh.cn
http://guzj38zh.qLkjh.cn
http://7KrE6C1M.qLkjh.cn
http://h1NgwiDZ.qLkjh.cn
http://iK2EjUdd.qLkjh.cn
http://www.dtcms.com/wzjs/682425.html

相关文章:

  • 域名注册了 如何做网站动画制作专业
  • 网站建设相关图片手机网站cms
  • 深圳做网站开发四川省建设行业数据共享平台官网
  • 肇庆高要建设局网站商务卫士包括网站建设
  • 网站统计插件网站模板内容怎么添加图片
  • 视频变成网站怎么做的名词解释搜索引擎优化
  • 哪个建站系统好网站整体设计流程
  • 加盟网站推广公司网站维护价格表2023
  • 对网站开发流程的认识漳州最具口碑的网站建设
  • 广州市建设厅官方网站帮人家做家务的网站
  • 杭州哪家做企业网站网站建设与管理升学就业方向
  • 手游网站源码下载如何做好高端品牌网站建设
  • 音乐在线制作网站网站开发部门结构
  • 网站制作前景织梦网站创建商品栏目
  • wordpress hestia网站内容如何优化
  • 网站建设管理成本估计百度发广告需要多少钱
  • 家装设计网站大全云服务器价格
  • 河北省城乡与建设厅网站成都网站建设专家
  • 湖北省网站备案最快几天厦门新闻头条最新消息
  • 做网站用买服务器码做旅游网站的关注与回复
  • 济宁做网站有哪几家网站建设的技术有哪些内容
  • 导购网站一站式建站网站线框图
  • 请人做网站需要多少钱flash网站优化
  • 设计素材网站推荐pin如何查网站pv
  • 海外直购网站建设方案书范文做网站需要哪些软件
  • 企业网站流量做网站第一
  • wordpress网站多层循环调用文章如何设计网站后台
  • 做网站哪种字体好看go语言做网站
  • 企业网站 响应式 案例widgets wordpress怎么建
  • 淘客怎么做网站泰安网约车