题目概要:
给定一个模式串 S S S,然后给了 n n n 个字符串,求这 n n n 个串的循环同构在 S S S 中出现次数。
循环同构:取从左开始任意长度子串置于末尾。
每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以对“循环相似旋律”进行相同的变换能继续得到原串的“循环相似旋律”。
思路
对循环同构的处理我们很容易想到可以把相同的子串接到末尾,这样 T [ i − n + 1 , i ] T[i-n+1,i] T[i−n+1,i]就是T的同构。
求某个串在模式串中出现次数不难想到ac自动机,但是由于存在循环同构的原因,复杂度最坏会达到 O ( n 2 ) O(n^2) O(n2)。
我们知道对于 S A M SAM SAM 中每个状态, e n d p o s endpos endpos 就是这个状态中的子串出现的次数。
于是,我们先构造 S S S 的 S A M SAM SAM,并维护两个状态。 u u u,以 T [ i ] T[i] T[i]为结尾的最长公共前缀所属状态, l l l ,最长公共前缀的长度。初始时 u = 1 , l = 0 u=1,l=0 u=1,l=0。
假设我们已知 T [ i − 1 ] T[i-1] T[i−1] 的 u , l u,l u