【发布时间】:2021-02-10 00:13:57
【问题描述】:
二进制-十进制
我们得到一个长度为n的二进制字符串 S,其中每个字符都是'1'或'0'。
我们被要求对字符串执行几个查询。
在每个查询中,我们都会得到整数 L 和 R。 而且我们必须用十进制表示来告诉子字符串S[l..r]的值。
示例测试用例:
Input:
1011 (string S)
5 (number of queries)
1 1 (l, r)
2 2
1 2
2 4
1 4
Output:
1 (1 * 2^0 == 1)
0
2
3 (0 * 2^2 + 1 * 2^1 + 1 * 2^0)
11 (1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 11)
约束
1 < N < 10^5
1 < Q < 10^5
由于数字可能很大,我们需要以 10^9 + 7 为模打印。
接近
所以基本上我们需要将二进制表示的子字符串 S[l..r] 转换为十进制。
我预先计算S[i...n-1]对所有i:[0, n-1]的结果 strong> 在 数组 B 中。 所以现在B[i]代表子串S[i..n-1]的十进制数表示。
vector<int> pow(1e5, 1);
for(int i = 1; i < 1e5; i++) {
pow[i] = (pow[i - 1] * 2) % mod;
}
string s;
getline(cin, s);
vector<int> B(n, 0);
int prev = 0;
for(int i = 0; i < n; i++) {
B[(n - 1) - i] = (prev + (s[(n - 1) - i] == '1' ? pow[i] : 0)) % mod;
prev = B[(n - 1) - i];
}
while(q--) {
int l, r;
cin >> l >> r;
cout << ((B[l] - (r + 1 < n ? B[r + 1] : 0) + mod) % mod) / pow[n - (r + 1)]<< "\n";
}
return 0;
通过上述方法,只有示例测试用例通过,所有其他案例都给出错误答案(WA)。
我什至尝试使用 Segment tree 来解决这个问题,但这也不起作用。
解决这个问题的正确方法是什么?
【问题讨论】:
-
你从右边填B[],从左边填s[]?
-
@MBo,是的,这是一个错字,已修复,但仍然无法正常工作。
标签: c++ algorithm math data-structures modulus