Trie:hdu 4825、1251、1247、Poj 3764


hdu 4825链接
在这里插入图片描述
题目意思很简单,就是要求最大异或值的数。
我们可以从二进制的最高位开始选择,不断的排除一些数。我们先假设存在某些数字的二进制数是与当前查找的数不一样的,我们进入这一部分数进行查找,以此重复,不断排除一部分数,最后找到最佳的数。
如果在查找的过程中某一位不存在不相同的数,我们就只能从相同的数中查找了。
总结一句就是优先查找不同的。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef unsigned int ui;//unsigned int防止出现爆int.
const int N1 = 4e6 + 10;
ui trie[N1][2], tot, flag[N1];
void build_trie(ui x) {//建立字01字典树的过程。int root = 0;for(int i = 31; i >= 0; i--) {题意不超过2^32,从32位开始,其实也可以30,但是不要超过31,如果用int.int u = x >> i & 1;if(!trie[root][u])    trie[root][u] = ++tot;root = trie[root][u];}flag[root] = x;//这个节点标记为这个数的值。
}
ui find_max(ui x) {//找到与之匹配的异化值最大的数。int root = 0;for(int i = 31; i >= 0; i--) {int u = x >> i & 1;//取出这一位的二进制数。if(trie[root][!u])//优先进入与之不同的二进制数位。root = trie[root][!u];else    root = trie[root][u];}return flag[root];//返回查找的最优答案。
}
int main() {
//    freopen("D:\\Code\\ce.txt", "r", stdin);ui t, a, n, m;scanf("%u", &t);for(int k = 1; k <= t; k++) {printf("Case #%d:\n", k);tot = 0;memset(trie, 0, sizeof trie);//多组读入,注意清零。scanf("%u %u", &n, &m);for(int i = 0; i < n; i++) {scanf("%u", &a);build_trie(a);}for(int i = 0; i < m; i++) {scanf("%u", &a);printf("%u\n", find_max(a));}}return 0;
}


hdu 1251链接
在这里插入图片描述
这题应该比上题还简单,直接上代码了。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 3e6 + 10;
int trie[N][26], flag[N], tot;
char s[20];
void build_trie() {int root = 0, n = strlen(s);for(int i = 0; i < n; i++) {int u = s[i] - 'a';if(!trie[root][u])    trie[root][u] = ++tot;root = trie[root][u];flag[root]++;//单词经过的节点,加一。}
}
int find_sum() {int root = 0, n = strlen(s);for(int i = 0; i < n; i++) {int u = s[i] - 'a';if(!trie[root][u])    return 0;//出现一个字母在字典中不匹配,立即返回查找不到。root = trie[root][u];}return flag[root];//返回这个节点有多少单词经过
}
int main() {
//    freopen("D:\\Code\\ce.txt", "r", stdin);while(gets(s)) {if(s[0] == 0)break;build_trie();}while(gets(s))printf("%d\n", find_sum());return 0;
}


hdu 1247链接
在这里插入图片描述
这题应该是比上两题更难一点,具体看代码详解吧。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N1 = 5e6 + 10, N2 = 5e4 + 10;
int trie[N1][26], is_word[N1], tot;
string str[N2]; 
void build_trie(string s) {//建字典树。int root = 0, n = s.size();for(int i = 0; i < n; i++) {int u = s[i] - 'a';if(!trie[root][u])    trie[root][u] = ++tot;root = trie[root][u];}is_word[root] = 1;//标记这个节点有单词。
}
bool judge_tail(string s, int pos) {//判断后缀是否是一个单词,pos是后缀的起始位置。int root = 0, n = s.size();for(int i = pos; i < n; i++) {int u = s[i] - 'a';if(!trie[root][u])    return false;root = trie[root][u];if(is_word[root] && i == n - 1)//整个需要判断的后缀是否是一个单词。return true;}return false;
}
bool judge_front(string s) {//这里判断单词的前缀是否是一个单词。int root = 0, n = s.size();for(int i = 0; i < n; i++) {int u = s[i] - 'a';if(!trie[root][u])    return false;//有一个字母没有查找到,返回失败。root = trie[root][u];if(is_word[root] && judge_tail(s, i + 1))//前缀是一个单词,接下来就是判断后缀是否是一个单词。return true;}return false;
}
int main() {
//    freopen("D:\\Code\\ce.txt", "r", stdin);int n = 0;while(cin >> str[n])build_trie(str[n++]);for(int i = 0; i < n; i++)if(judge_front(str[i]))cout << str[i] << endl; return 0;
} 


Poj 3764链接
在这里插入图片描述
这题应该是这几题里面最难的题了,但是却又跟第一题有点类似。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N1 = 2e5 + 10, N2 = 4e6 + 10;
int trie[N2][2], tot, cnt, n, head[N1], a[N1];
struct Edge {//链式向前星。int to, next, value;
}edge[N1];
void add(int x, int y, int value) {//存图的过程edge[cnt].to = y;edge[cnt].value = value;edge[cnt].next = head[x];head[x] = cnt++; 
}
void dfs(int u, int fa, int sum) {//通过dfs得到每个节点到根节点的异或值。a[u] = sum;for(int i = head[u]; i; i = edge[i].next) {if(edge[i].to != fa)	dfs(edge[i].to, u, sum ^ edge[i].value);}
}
void build_trie(int x) {//建立字典树。int root = 0;for(int i = 30; i >= 0; i--) {int u = x >> i & 1;if(!trie[root][u])	trie[root][u] = ++tot;root = trie[root][u];}
}
int find_max(int x) {//查找最大值。int root = 0, ans = 0;for(int i = 30; i >= 0; i--) {int u = x >> i & 1;if(trie[root][!u]) {ans += (1 << i);//如果走这里的话,我们可以得到答案的这一位是1,或者我们可以像第一题一样现在建立字典树的时候记录下节点的值然后在返回这个最大值,最后再和当前查找的异或。root = trie[root][!u];}else	root = trie[root][u];}return ans;
}
int main() {while(scanf("%d", &n) != EOF) {tot = 0, cnt = 1;memset(trie, 0, sizeof trie);memset(head, 0, sizeof head); //多组输入, 清零。for(int i = 1; i < n; i++) {int x, y, v;scanf("%d %d %d", &x, &y, &v);add(x, y, v);add(y, x, v);}dfs(0, 0, 0);for(int i = 0; i < n; i++)//得到异或值后,开始建字典树。build_trie(a[i]);int ans = 0;for(int i = 0; i < n; i++)ans = max(ans, find_max(a[i]));printf("%d\n", ans);	}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard

上一篇《K8S集群部署》中搭建好了一个最小化的K8S集群&#xff0c;这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制&#xff0c;然后部署一下Dashboard&#xff0c;完成可视化管理。本篇已加入了《.NET Core on K8S学习实践系列文章索引》&#…

02 | 健康之路 kubernetes(k8s) 实践之路 : 生产可用环境及验证

上一篇《 01 | 健康之路 kubernetes(k8s) 实践之路 : 开篇及概况 》我们介绍了我们的大体情况&#xff0c;也算迈出了第一步。今天我们主要介绍下我们生产可用的集群架设方案。涉及了整体拓补图&#xff0c;和我们采用的硬件配置&#xff0c;目前存在的问题等内容。遵循上一篇提…

[开源] .NETCore websocket 即时通讯组件---ImCore

ImCore 是一款 .NETCore 下利用 WebSocket 实现的简易、高性能、集群即时通讯组件&#xff0c;支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能。开源地址&#xff1a;https://github.com/2881099/im &#xff0c;求 star~~dotnet add package ImCoreIM服务端publ…

【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库

在这篇文章中&#xff0c;我展示了如何在 Linux 上构建针对 .NET Framework 版本的.NET项目&#xff0c;而不使用 Mono。通用使用微软新发布的 Mocrosoft.NETFramework.ReferenceAssemblies NuGet 包&#xff0c;您将不需要安装除 .NET Core SDK 之外的任何其他软件包&#xff…

DevOps书单:调研了101名专家,推荐这39本必读书籍

任何一个领域都遵循从新人到熟手&#xff0c;从熟手到专家的路径。在成长过程中&#xff0c;DevOps人经常会陷入没人带&#xff0c;没人管&#xff0c;找不到职业方向的迷茫。DevOps是在商业演进与企业协作的进化过程中诞生的一个全新职业&#xff0c;被很多人看成是一个“全栈…

面对人性,有的选择向左,有的向右

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达有时也会有感而发&#xff0c;来加个餐&#xff5e;我的第「84」篇原创敬上前天早上&#xff0c;在36kr看到一篇文章《一个负能量的人&#xff0c;可以轻易搞垮周围人的生活》&#xff0c;讲述了可能我们每个人身边都存在…

10分钟了解分布式CAP、BASE理论

CAP理论2000年7月&#xff0c;Eric Brewer教授提出CAP猜想&#xff1b;2年后&#xff0c;Seth Gilbert和Nancy Lynch从理论上证明了CAP&#xff1b;之后&#xff0c;CAP理论正式成为分布式计算领域的公认定理。CAP定律说的是在一个分布式计算机系统中&#xff0c;一致性&#x…

ASP.NET Core Web Api之JWT刷新Token(三)

本节我们进入JWT最后一节内容&#xff0c;JWT本质上就是从身份认证服务器获取访问令牌&#xff0c;继而对于用户后续可访问受保护资源&#xff0c;但是关键问题是&#xff1a;访问令牌的生命周期到底设置成多久呢&#xff1f;见过一些使用JWT的童鞋会将JWT过期时间设置成很长&a…

简单dfs序 + 树链剖分

树链剖分 DFS序 先来讲一讲DFS序是什么东西&#xff0c;直接上图&#xff0c;方便理解。 估计巨巨们应该知道了DFS序的两个重要的东西&#xff0c;in,outin,outin,out数组。 ininin数组就是这个点进入DFS的时间。outoutout数组就是这个点退出DFS递归栈的时间。这个时间要注意…

WeihanLi.Npoi 导出支持自定义列内容啦

WeihanLi.Npoi 导出支持自定义列内容啦Intro之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求&#xff0c;起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导入导出的简单化&#xff0c;使用这个扩展导出的 Excel/csv 可以直接导入成 List<TEntity>&a…

让 .Net 更方便的导入导出 Excel

让 .Net 更方便的导入导出ExcelIntro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xl…

最大流,最小费用最大流:解析 + 各种板子

网络流初步 Edmond-Karp算法 网络流的基本概念 源点&#xff0c;这个点只有流量的流出&#xff0c;没有流入。汇点&#xff0c;这个点只有流量的流入&#xff0c;没有流出。容量&#xff0c;每条有向边的最大可承受的流的理论大小。流量&#xff0c;每条有向边的最大可承受的…

Zend创始人离职原来早已安排好

前边我们报导过&#xff0c;PHP 兼 Zend 公司联合创始人 Zeev Suraski 宣布目前已经从工作了 20 年的 Zend 公司离职。2 日晚间&#xff0c;知名 PHP 开发者&#xff0c;同时也是 PHP JIT 主力鸟哥&#xff08;惠新宸&#xff09;在朋友圈中曝出猛料&#xff1a;原来一切都是安…

梯度下降:求线性回归

梯度下降的直线拟合 实现说明 给定若干个x,yx, yx,y并且求得一个最佳的yaxby ax byaxb&#xff0c;也就是二元一次方程组的解。 先放上给定的散点&#xff0c;以及求得的线性回归的直线的图片。 我个人认为&#xff0c;这里的梯度优化&#xff0c;就是通过一个关键式子los…

3分钟了解数据库事务

事务是由几个读取和修改数据的sql命令组成的&#xff0c;但是知道commit命令被执行之后&#xff0c;修改操作才被认为是正常的完成。显式事务常以Begin tran语句开头&#xff0c;以commit tran或者rollback tran语句结尾的。事务具有acid属性原子性&#xff08;atomicity&#…

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

NETCore提供了三种不同类型用于生产的REST API&#xff1a; HttpWebRequest;WebClient;HttpClient&#xff0c;开源社区创建了另一个名为RestSharp的库。如此多的http库&#xff0c;该怎样选择呢&#xff1f;01HttpWebRequest这是.NET创建者最初开发用于使用HTTP请求的标准类。…

.NetCore 2.1以后的HttpClient最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能&#xff0c;它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。01介绍在.NETCore平台的2.1新增了HttpClientFactory&#xff0c;虽然HttpClient这个类实现了disposable&…

点分治(简要讲解 + 模板)

树上点分治 思想 两个点之间的距离无非就是两种关系&#xff1a;我们约定dis[i]dis[i]dis[i]表示这个点到当前根节点的距离 dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个根节点的不同子树上。dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个棵子…

在 alpine 中使用 NPOI

在 alpine 中使用 NPOIIntro在 .net 中常使用 NPOI 来做 Excel 的导入导出&#xff0c;NPOI 从 2.4.0 版本开始支持 .netstandard2.0&#xff0c;在 dotnet core 应用也可以用 DotNetCore.NPOI。对于 .NET Core 应用来说&#xff0c;如果没有特殊的需求&#xff0c;alpine 是最…

Educational Codeforces Round 16 C. Magic Odd Square 矩阵构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个奇数nnn&#xff0c;让你构造一个n∗nn*nn∗n的矩阵&#xff0c;矩阵的每个位置依次填上[1,n∗n]之内的数[1,n*n]之内的数[1,n∗n]之内的数&#xff0c;满足每行、每列、以及主对角线的和都是奇数。…