这个题题面好可爱嘛~
那我们考虑简化一下~
第一问是求每个文本串中含有的模式串个数。
第二问是求每个模式串是多少个文本串的子串。
看到多串匹配肯定想到广义 SAM啦,所以我们建出广义 SAM,建立的同时标记 size,就是每次 upd的时候 size[rt]++;
第一问呢,直接把每个文本串扔到广义 SAM上跑一遍,跑完了输出 size[rt]就行了。
第二问呢,我们在做第一问的时候就要在跑完的时候把 tag[rt]++,就是标记一下这个位置会有一个文本串匹配到。然后依次查询每个模式串,每次 ans把沿途的 tag[rt]全部累加起来就可以啦。
完结撒花~
一个不知道对不对的理解:广义 SAM和 SAM的关系类似于可持久化 Trie树和 Trie树的关系。(如果大佬觉得不对请指正哦!)
upd:当时我太 naive 了,这个理解不对。
代码比较简单啦~还是贴一下核心部分吧
有错误请大佬批评指正吖!有问题请留言吖!
2 条评论
boshi · 2020年1月5日 8:07 下午
SAM 和广义 SAM 的区别,我个人感觉更类似于 KMP 和 AC 自动机的区别。
Kylin_xy · 2020年1月5日 10:34 下午
对对,这个比喻很贴切,谢谢大佬!