和C++版输出结果一致,但提交不通过。
# 区间内自审值之和即该区间内包含1的连续子串的个数
while True:
try:
n = int(input())
s = input()
q = int(input())
dp = [0] * (n+1) # dp[i]表示前i个字符中包含1的子串的个数
left = [0] * (n+1) # 当前字符左边最近的1的位置(不包含自身)
right = [n+1] * (n+1) # 当前字符右边最近的1的位置(不包含自身)
pos = [0] # 记录字符串中1的位置
res = [] # 记录输出结果
for i in range(1, n+1):
left[i] = pos[-1]
if s[i-1] == '1':
pos.append(i)
pos.pop(0) # 去掉开头的0
pos.append(n+1) # 末尾增添n+1
for j in range(0, n+1):
if j >= pos[0]:
pos.pop(0)
right[j] = pos[0]
for k in range(1, n+1):
if s[k-1] == '0':
dp[k] = dp[k-1] + left[k]
else:
dp[k] = dp[k-1] + k
for _ in range(q):
l, r = map(int, input().split())
if right[l-1] > r: # 区间内全是0
ans = 0
else: # 区间内至少有1个1
if left[l] == 0:
ans = dp[r] - (l-1) * (r - right[l-1] + 1)
else:
ans = dp[r] - dp[l-1] - left[l] * (r - l + 1) - (l - left[l] - 1) * (r - right[l-1] + 1)
res.append(ans)
for i in res:
print(i)
except:
break

京公网安备 11010502036488号