洛谷LCS2 - Longest Common Substring II
题目大意
给你一些字符串,求它们的最长公共子串。
字符串个数不超过 10 10 10,每个字符串的长度不超过 100000 100000 100000。
题解
可以先看看LCS - Longest Common Substring。
这题与上面那题类似,只不过要多一些操作。
首先,用第一个字符串建一个 S A M SAM SAM,然后在 S A M SAM SAM上面匹配其他的字符串,匹配的方式见上面这道题。
因为有多个字符串,所以不能只用 n o w now now了。我们用 w [ p ] . m x [ i ] w[p].mx[i] w[p].mx[i]表示在用字符串 i i i来在 S A M SAM SAM上匹配时 S A M SAM SAM的位置 p p p上能够达到的最长的长度。
当然,如果一个点可以被匹配到,则这个点的祖先都可以被匹配到。所以每个点要对其子树取 m a x max max,然后对自己的长度取 m i n min min。这个操作我这边用的是拓扑排序来实现,当然其他方法也可以。
最后,对于 S A M SAM SAM上的每一个位置 p p