hihocoder1465(循环同构串在模式串中出现次数)

传送门

题目概要:

给定一个模式串 S S S,然后给了 n n n 个字符串,求这 n n n 个串的循环同构在 S S S 中出现次数。
循环同构:取从左开始任意长度子串置于末尾。

每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以对“循环相似旋律”进行相同的变换能继续得到原串的“循环相似旋律”。

思路

对循环同构的处理我们很容易想到可以把相同的子串接到末尾,这样 T [ i − n + 1 , i ] T[i-n+1,i] T[in+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=1l=0
假设我们已知 T [ i − 1 ] T[i-1] T[i1] u , l u,l u

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值