和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