Codeforces round 146 C - Cyclical Quest(后缀自动机)

Codeforces round 146 C - Cyclical Quest

题意:给出一个字符串s,这里我称之为母串,然后再给出n个子串,n<=10^5,子串长度总和不超过10^6。问,对于每一个子串的所有不同的同构串在母串中出现的次数总和。

解题思路:拿到这题,第一想法就是后缀自动机。。做法是这样的,先给母串建sam,为了解决同构问题,我们将读进来的子串复制一遍,除去最后一个字符。然后拿复制好的字串去自动机上跑,要记录的是当前能匹配的最长长度是多少,如果能匹配的长度大于等原子串长度,那么是能在母串中找到这个同构串的,那么怎么找出个数呢?很简单,其实就是匹配的当前节点的right集合的大小。为什么呢?因为每个节点都代表一个不一样的子串嘛。。但是这样还是不正确的,因为我当前走到的节点也许并不是最接近的,所以我们要沿着fa边走,直到fa的val小于原子串的长度,这时找到的节点的|right|才是真正的出现次数。然后还有一个问题就是有可能同构串相同,比如aa,那么它的同构串是aa,aa所以我们匹配到某一个节点时要把这个节点mark掉,下一次如果又走到这个mark节点,那么就不统计了。最后记得把mark清零。

代码:

你可能感兴趣的:(codeforces,后缀自动机)