Maybe something wil|

Semorius

园龄:1年9个月粉丝:4关注:10

7.20 字符串

传送门

题单一放出来,各路神仙各显神通,SAM 大神怒切的同时大喊这不都是板题?AC自动机大神大喊他不会 KMP?Z函数大神大叫这是板题?

而我,发现字符串算法是我忘得最干净的一块,只记得无脑 Hash。一怒之下,重学了 SAM

CF432D Prefixes and Suffixes

统计每个字串出现的次数,这不 SAM 板题。问题在于怎么判断一个串是否既是前缀又是后缀。这个东西 KMP 显然能做,但都有 SAM 了,最方便的方法是在 SAM 上查前缀的同时,用 Hash 判一下是否为后缀,也可以将整串所在节点到根的整条后缀链上的节点(每个节点代表的状态里子串的集合即为所有后缀组成的集合)打上标记。

P2852 [USACO06DEC] Milk Patterns G

最喜欢的无脑 Hash,二分最长的长度,Hash 判断是否存在出现次数至少为 K 次的串。

时间复杂度 O(nlogn)

P4081 [USACO17DEC] Standing Out from the Herd P

单个串里求本质不同的子串个数是 SAM 板题,但有多个串时,好像就不太行了。可以用伪广义 SAM,每次插完一个串就把 las (记录上次结尾节点的变量)改为根。统计时和求一个子串在整串中出现次数的方法类似,除分裂出来的虚点外每次加点时把该点的 col 赋为当前串的编号。建完 SAM 后在后缀链组成的树上从下往上转移,若一个节点的子节点中有多种编号,则说明它包含的子串共属于多个字符串,否则就对应更新答案。

本文作者:Semorius

本文链接:https://www.cnblogs.com/Semorius/p/17572871.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Semorius  阅读(19)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起