和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