给定一串K位二进制数字,需要给出最大区间的大小,使得在这个区间内每一位数字的和相等。
设一个数组sum[i][k]用于记录从第一个数字到第i个数字中第k位数字的和,这样就可以简单地计算出任意一个区间内每一位数字的和,也就是要求出sum[j][k] - sum[i][k]对于所有k都相等的区间[i, j]。
但是这样直接搜索的复杂度是O(N2),所以需要用哈希来简化。
sum[j][0] - sum[i][0] = sum[j][1] - sum[i][1]
有
sum[j][1] - sum[j][0] = sum[i][1] - sum[i][0]
所以只要结点满足第k位数的总数与第0位数的总数差相等就可以。这一步可以使用哈希策略,详见代码。
C++ Code
1 |
|