algorithm - 给定二进制字符串中不同数字的数量及其总和

标签 algorithm bit-manipulation bit

我正在考虑这个问题,但不知道从哪里开始 >>

我们得到一个二进制字符串,除了暴力之外,是否有任何可能的方法来找到它所包含的不同数字的数量(它们的二进制表示为给定字符串中的子字符串)及其总和。

例如:

如果给定的二进制是:“1101”那么它可能包含的数字是 -

0,01,10,11,101,110,1101

十进制:

0, 1, 2, 3,  5,  6,  13

总和 = 0 + 1 + 2 + 3 + 5 + 6 + 13 = 30

最佳答案

提示

看看Suffix Trees , 他们让你在 O(n) 中找到一个字符串中不同子串的数量。

要找到不同数字的总和,我建议您实际计算反转字符串的后缀树,换句话说,您正在计算前缀树。

然后您可以为每个前缀节点计算其下所有不同数字的总和。

反转字符串更好的原因是我们在数字末尾添加一个数字很容易(乘以 2 并添加数字),因此我们可以对小计进行此操作。

如果我们尝试对后缀树做同样的事情,我们会想在所有数字的前面添加一个数字,但是数字的长度不同,因此很难看出您可以对后缀树执行什么操作总计。

在计算前缀树时要小心忽略以 0 开头的分支,否则您也会将 001 和 01 和 1 视为不同的分支。

我相信这会导致整个操作的 O(n) 成本,其中 n 是字符串中的位数。

关于algorithm - 给定二进制字符串中不同数字的数量及其总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18399054/

相关文章:

c - 奇数位的位奇偶校验码

c++ - 基于位掩码从值中异或所有位的最快方法?

c++ - 当位(而不是字节)的顺序至关重要时的字节序

php - 树遍历 - 在两片叶子之间寻找

c - 快速物流功能

java - 快速排序算法无法正常工作

java - 使用 XOR 和加法对 int 求反

java - 只是有点困惑,因为我不知道 java 中 Hex int 的 'bottom' 位是什么意思

c - 为位域生成相应掩码的函数

algorithm - 在没有循环的情况下计算给定数字的负二进制表示