题意:对于一个01串,每次选择一对相邻的数字进行同或操作,如果最后剩余数字只有一个1,则这是一个好的串,求出一个01串所有子串是好的串的数量。
由于每次操作0的个数的奇偶性不会改变,所以能够化为1的串的零的个数必定为偶数,因为最终结果的零的个数是偶数。充分性可通过数学归纳法证明。
使用前缀和可以在O(n)时间下得到结果。
n=II()
s=LCI()
pre=[1,0] # 之前的串中零的个数为偶/奇数的个数
ans=0
cnt=0
for i in range(1,n+1):cnt+=s[i]=='0'# 每次添加一个字符后 如果当前个数为偶数# 则将之前串中零的个数为偶数的串进行累加# 相当于计算了这些偶数的串的结尾到当前字符串所形成的子串的个数# 因为如果是奇数个 那么这些奇数串的结尾到当前字符形成的子串的零的个数就是奇数个 不符合# 因为每次只需要添加与当前字符有关的子串即可ans+=pre[cnt&1] # 这个操作相当于记录了在当前位置上形成的串是偶数还是奇数个 用于后续使用pre[cnt&1]+=1
print(ans)
