找出两个异或最大的元素
Finding two elements whose XOR is maximum
我正面临一个问题,需要我从给定整数数组中找到一个元素,其异或与给定数字最大。
的例子:
A[] = {2,7,3,6};数字= 4.
2^4 = 6,7 ^4 = 3,3 ^4 = 7,6 ^3 = 2。因此,3应该是答案,因为3^7是最大值。
我试图遵循一个类似于trie的结构,并继续逐位寻找可能的最大结果,即从MSB开始,如果我的位是1,那么我向下遍历0侧,如果我的位是0,那么我向下遍历节点的1侧。我已经提出了以下代码。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<queue>
#include<cstdlib>
#include<numeric>
#include<set>
#include<map>
#include<deque>
#include<climits>
#include<cassert>
#include<cctype>
#include<ctime>
#include<iterator>
#include<iomanip>
#include<functional>
#include<fstream>
#include<ostream>
#include<istream>
#include<sstream>
using namespace std;
#define sf(n) scanf("%d",&n)
#define pf(n) printf("%d",n)
#define pfln(n) printf("%dn",n)
#define vi vector <int >
#define pb push_back()
#define debug(n) printf("n = %dn",n)
#define PI 3.14159265358979
#define LL 1000000007
int ans[32];
class TrieNode{
public:
int bit;
bool end;
TrieNode *child[2];
TrieNode(int val){
this->bit = val;
this->end = false;
this->child[0] = NULL;
this->child[1] = NULL;
}
};
void addWord(TrieNode *node,int n){
int a[32];
int bin[32];
int m = n;
int j = 0;
//cout<<"in addingn";
while(m>0){
a[j++] = m%2;
m/=2;
}
for(int i = j-1,k=0 ; i>=0 ; k++,i-- ){
bin[32-i-1] = a[i];
}
for(int i = 0 ; i < 32-j ; i++){
bin[i] = 0;
}
for(int i = 0 ; i < 32 ; i++)
cout<<bin[i];
for(int i = 0 ; i < 32 ; i++){
if(node->child[bin[i]] == NULL){
TrieNode *tmp = new TrieNode(bin[i]);
node->child[bin[i]] = tmp;
node = node->child[bin[i]];
}
else{
node = node->child[bin[i]];
}
}
node->end = true;
}
void findmax(TrieNode *node, int q){
int a[32];int j = 0;
int bin[32];
while(q>0){
a[j++] = q%2;
q/=2;
}
for(int i = j-1,k=0 ; i>=0 ; k++,i-- ){
bin[32-i] = a[i];
}
for(int i = 0 ; i < 32-j ; i++){
bin[i] = 0;
}
for(int i = 0 ; i < 32 ; i++){
if(node->child[0]->bit == bin[i] && node->child[1]!=NULL){
ans[i] = node->child[1]->bit;
node = node->child[1];
}
else if(node->child[1]->bit == bin[i] && node->child[0]!=NULL){
ans[i] = node->child[0]->bit;
node = node->child[0];
}
else{
ans[i] = node->child[0] == NULL?node->child[1]->bit:node->child[0]->bit;
node = node->child[0] == NULL?node->child[1]:node->child[0];
}
}
}
int main()
{
std::ios_base::sync_with_stdio(false);
TrieNode *root = new TrieNode(-1);
addWord(root,2);
addWord(root,7);
addWord(root,3);
addWord(root,6);
findmax(root,4);
for(int i = 0 ; i < 32 ; i++){
cout<<ans[i];
}
return 0;
}
但是我一直得到一个分割错误,不能运行程序。我已经尝试了所有的技巧来调试代码,但我不能找出问题所在。请帮忙查找运行时错误的原因。
谢谢
假设您必须找到数组中的最大值。你可以这样做:
int A[] = {2,7,3,6};
int maximum = std::numeric_limits<int>::min();
for(int i = 0; i < 4; ++i)
if(A[i] > maximum) maximum = A[i];
你要做的是更换条件。
for(int i = 0; i < 4; ++i)
if(func(A[i]) > maximum) maximum = A[i];
其中func()
是一个函数,可以是这样的:
int func(int x)
{
return x ^ 4;
}
当然,这是一个虚拟的实现,例如,您可以传递4作为参数,但我希望您能理解。另一方面,您可以使用std::max_element()
来执行此操作:
int A[] = {2,7,3,6};
int maximum = std::max_element(std::begin(A), std::end(A), [](int const a, int const b){return func(a) < predicate(b)});
(其中func()
与上面的函数相同)
相关文章:
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 查找两个排序向量中共有的元素
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 为什么两个矢量元素的地址有这么大的差距?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 如何使用谷歌测试检查两个枚举类元素的相等性?
- C++函数返回两个 char 数组的相同索引元素
- 我想创建一个嵌套数组,该数组由另一个数组中的所有元素组成,但分为两个
- 如何仅考虑 *指针中的前两个元素
- 为什么具有两个元素的发起器语法将一个元素而不是两个元素放入字符串向量中?
- 我应该如何使用remove_if删除两个数字范围内的元素
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- C++ std::向量插入两个元素替代算法失败
- 删除两个相邻的元素并用矢量中的单个元素替换它们
- 如何比较C 列表中的两个连续元素
- 通过将两个参数包的元素线程化为类型对来解压缩这两个参数包
- 数组中两个元素的最大异或
- 优化两个 std::vector<std::complex> 的元素乘积,使用 <float>fftw_malloc() 分配
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?