【问题标题】:maximum value of xor operation异或运算的最大值
【发布时间】:2014-04-02 17:57:19
【问题描述】:

我想出了这个问题。

有一种加密算法广泛使用按位异或运算。该加密算法使用一系列非负整数 x1, x2, ... xn 作为密钥。为了有效地实现这个算法,Xorq 需要为给定的整数 a、p 和 q 找到 (a xor xj) 的最大值,使得 p

输入

输入的第一行包含一个整数 T (1

每个测试用例的第一行包含由单个空格分隔的两个整数 N 和 Q (1 1, x2, ... xn 由单个空格分隔 (0 j i、pi 和 qi (0 i i i

输出

对于每个查询,打印 (ai xor xj) 的最大值,使得 pii 在一行中。

示例输入

1
15 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
10 6 10
1023 7 7
33 5 8
182 5 10
181 1 13
5 10 15
99 8 9
33 10 14

样本输出

13
1016
41
191
191
15
107
47

说明

First Query (10 6 10): x6 xor 10 = 12,
    x7 xor 10 = 13, x8 xor 10 = 2, x9 xor 10 = 3, x10 xor 10 = 0,
    therefore answer for this query is 13.
Second Query (1023 7 7): x7 xor 1023 = 1016,
    therefore answer for this query is 1016.
Third Query (33 5 8): x5 xor 33 = 36, x6 xor 33 = 39,
    x7 xor 33 = 38, x8 xor 33 = 41, therefore answer for this query is 41.
Fourth Query (182 5 10): x5 xor 182 = 179,
    x6 xor 182 = 176, x7 xor 182 = 177, x8 xor 182 = 190,
    x9 xor 182 = 191, x10 xor 182 = 188,
    therefore answer for this query is 191.

我首先使数字长度(二进制) 在给定范围内相等,然后比较'a'位 具有特定 xj 值的位。但时间已超过。 java中的最大时间限制是5秒。

【问题讨论】:

  • “Xorq 需要为给定的整数 a、p 和 q 找到 (a xor xj) 的最大值,使得 p 什么是 Xorq? xj 是什么?
  • 如果你想让事情尽可能慢,一定要用字符串做数学运算。

标签: algorithm


【解决方案1】:

我没有详细阅读您的代码,但您似乎在 r = p - 1; 范围内有循环。 r

给定 ai,我们希望在给定范围内找到一个 xi 的值,其中尽可能多的最高位是 ai 的倒数。一切都在 0 到 2^15 之间,因此无需担心太多位。对于 n = 1 到 15,您可以根据 xi 的 n 个最高位将其划分为 2、4、8、16.. 32768 个部分。对于每个部分,按照找到每个可能值的位置的排序顺序保留一个列表,因此对于最高位,您将有两个列表,一个给出位模式为 0 的位置...... .....和一个给出位模式为1的位置............对于每个三元组,您可以在特定部分上使用二进制印章来查找其中是否有任何位置您的前 n 位具有您正在寻找的位模式的范围。如果他们这样做,那很好。如果不是,您将不得不接受其中一个异或位置为 0,并稍微修改您要查找的模式,再设置一个高位。

设置成本是 xi 的 15 次线性传递,这可能比您读入它所花费的时间要少。对于每一行,您可以执行 15 次二进制运算,以查看 xi 的哪些值与前 n 位匹配,如果您无法匹配特定位,则修改您查找的最高位的模式。

我认为如果您通过将问题代码作为单独的子程序将 I/O 与问题代码分开,您的程序会更清晰。这也将更容易将一个版本的问题代码与另一个版本进行比较,看看哪个版本更快,以及它们是否都得到相同的答案。

【讨论】:

  • 什么是 2,4,6,8... 和三连音部分我看不清楚,请详细说明
  • 糟糕 - 我的意思是 2、4、8、16,... 如果您在最高位选择,您只有两个子列表,在最高 2 位,4 个子列表,在最高 3 位8 个子列表,依此类推。很抱歉 - 我已经编辑过了。
  • 我认为划分部分需要更多时间。我认为在给定的子范围内,我将所有这些与“a”逐位从 msb 到 lsb 进行比较,直到找到 amswer。这里假设所有给定范围内的值在位位置具有相同的值(即 1 或 0)然后跳过该位并移动到下一位。重复此操作直到剩余一个值。
  • 它可能取决于提供的参数,但由于我的方法的成本不依赖于 q - p 至少会有一些参数,q - p 的值很大,它更快.
【解决方案2】:

我在原始算法中发现的最大效率低下是 N 可以达到 100,000,但 ax 只能达到 214。所以我会编写类似这样的伪代码:

bool set[256] = { false };
for (j = p; j <= q; j++) set[x[j]] = true;
for (k = 255; !set[a ^ j]; k--);
return k;

在最坏的情况下,这会将xor 操作的数量减少到 256 个。

【讨论】:

  • 那里有一个错字,问题是 1
猜你喜欢
  • 2015-03-02
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2015-04-02
  • 1970-01-01
  • 2023-04-04
  • 2014-12-03
相关资源
最近更新 更多