2020牛客暑期多校训练营(第四场)C Count New String 巧妙的思维转化 + 广义后缀自动机板子

博客介绍了如何通过巧妙转化思路解决牛客暑期多校训练营的C题。针对原题中给出的式子,博主发现其实质是寻找本质不同的字符串,并提出使用广义后缀自动机(SAM)来解决。尽管可以采用n^2的暴力方法,但考虑到字符集大小K=10,博主提出倒序扫描字符串并构建字典树的方法,以减少插入操作的浪费,从而降低复杂度到n*k*k。该方法显著优化了解决方案,并提供了清晰的建树过程解析。
摘要由CSDN通过智能技术生成

这一题很巧妙啊!

首先题目给的式子就很吓人,但仔细分析我们就发现:

其实就是求:

这个只要把式子展开就能发现了。为啥能想到这?因为题目就是问本质不同的字串,我们肯定尽可能往这里构造(有后缀自动机可以解决这个问题)

好了到这里我们就可n^2暴力做这题了。——把n个后缀离线插入到字典树中,然后BFS建立SAM,跑一下就行,其实就是广义后缀自动机。

但显然AC不了。

我们还需要优化。看题目字符集大小K=10,

他这个条件肯定是有用的(除非出题人毒瘤,故意坑你,一般正常情况不会这样搞得,反正我没做过题目条件故意给低的题目)

我们把样例2的后缀写在纸上,发现暴力插入会有很多浪费的操作。

比如:

ddddd

  bccd

    ccd

      ad

        d

显然每个后缀的最后一个d只需要一次插入,而我们执行了5次,只有一次是在字典树上有效的。

后缀bccd,与ccd建立字典树时  ccd都是重复的。又浪费了3次。

我们很容易想到:字典树上的字符集大小是On级别的,暴力插入会浪费很多次数。

于是自然而然就想到倒着扫描字符串,然后建立字典树。

倒着扫描字符串,每次插入当前位置到n的后缀 这个字符串(这个字符串我们只需要插入在前面第一个大于等于当前字符位置后若干个当前字符即可。) 第一个大于等于当前字符 的字符 的前面的字符,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值