膜拜神犇YZY
题目链接:bzoj 3676
题意:写 B z o j 的题意就是简单——题意见上……
题解:这道题让我们求出所有回文串的出现次数乘以长度的最大值。对于一个回文串,它的长度很好知道,问题在于回文串的出现次数是多少。网上的诸多题解采用的是回文自动机的做法,然而我们这里介绍一个机智的拓扑排序的方法。我们可以发现如果一个极长的回文串 X 出现了一次,那么 X-2,X-4,X-6……所有的小回文串的出现次数都加一。可是如果直接这样计算的话,复杂度显然是 O(N^2) 的。所以我们考虑把已经出现过的回文串用它们的 Hash 值记录下来。然后不断的由 X 向 X-2 连边,直到 X 在之前已经出现过那么就停止连边,因为剩下的边在之前一定已经连过了。然后运用拓扑排序来计数就可以求出所有的回文串的出现次数了。
我思故我在:这一道题之所以没有自己想出来,关键是对马拉车这个算法的理解不到位,没有意识到本质不同的回文串数量不会超过 O(N) 个,所以至多会有 N 个节点。原因是,本质不同的回文串只有可能在马拉车暴力匹配的时候产生,既然每个点只有可能被暴力匹配一次,所以有最多 N 个本质不同的回文串。而且要注意这道题丧心病狂卡哈希,所以我们至少要用两个模数来算哈希值。