01分隔
第一行输入 n 字符串长度, 第二行为字符串,字符串只包含01,返回数组,表示每个位置前缀字符串能被划分为 01相同比例的子串的个数,例如 分成 两个子串01个数分别为 (a,b) & (c,d) 则满足 ad = bc。
思路: 遍历一次字符串,记录01出现次数,字典保存比例出现次数,比例化为最简,有一个出现0次的情况统一归为(0,1) | (1,0),将当前位置比例对应次数返回
import collections
import math
n = int(input())
s = input()
res = [1]*n
ones = zeros = 0
d = collections.defaultdict(int)
for i in range(n):
if s[i] == '0':
zeros += 1
else:
ones += 1
if zeros == 0:
d[(0, 1)] += 1
res[i] = d[(0,1)]
elif ones == 0:
d[(1,0)] += 1
res[i] = d[(1,0)]
else:
g = math.gcd(zeros, ones)
d[(zeros//g, ones//g)] += 1
res[i] = d[(zeros//g, ones//g)]
for r in res:
print(r, end=' ')