C题讨论合并的段是否相邻即可
from itertools import accumulate def f(x): return (x+1)*x >> 1 def main(): n = int(input()) s = list(map(len,input().split("0"))); m = len(s) if m < 3: return print(f(n)) t = [0]; t.extend(accumulate(s)) r = [0]; r.extend(accumulate(map(f,s))) ans = r[-1]+max(f(t[i+3]-t[i]+2)-(r[i+3]-r[i]) for i in range(m-2)) gap = [f(t[i+2]-t[i]+1)-(r[i+2]-r[i]) for i in range(m-1)] ans = max(ans,r[-1]+max(x+y for x,y in zip(accumulate(gap,max),gap[2:]))) print(ans) main()