【hdu5219】Repeating 题解

题目大意

  给定一个长度为 n 的小写字符串,问有多少个子串没有循环节。
  n<=1e5

题解

  套路×套路

  因为会出现大循环套小循环的情况,所以我们用莫比乌斯函数来容斥,那么问题变成,枚举一个循环长度 L,问有多少子串的循环节长度是 L 的倍数。

  然后在字符串上每 L 个建立一个关键点。对相邻的两个关键点 i 和 j,假设这两个前缀的 lcs 是 l1,这两个后缀的 lcp 是 l2,那么把这个长度为 l1+L+l2 的字符串提取出来(i 往前 l1 步,j 往后 l2 步),这里面任意一个长度为 L 的倍数(除了 1 倍)的子串都满足循环节长度是 L 的倍数。
  为了避免计重,可限制 l1 < L。