counter = collections.Counter(z)
for i in reversed(range(len(S))):
counter[i] += counter[i + 1]
fail = tstring.failure_table(S)
counter = collections.Counter(fail)
for i in range(len(S) - 1, 0, -1):
counter[fail[i - 1]] += counter[i]
counter[i] += 1
counter[len(S)] = 1
fail = tstring.failure_table(S)
l = len(S)
border_lens = [len(S)]
while l := fail[l - 1]:
border_lens.append(l)
z = tstring.z_array(S)
border_lens = [i for i, z_i in enumerate(reversed(z), start=1) if i == z_i]
i = (s+s).find(s, 1)
rep_len = 0 if i == -1 else i