Processing math: 100%

[SPOJ]NSUBSTR

danihao123 posted @ 2018年3月12日 15:31 in 题解 with tags SPOJ 后缀自动机 , 593 阅读
转载请注明出处:http://danihao123.is-programmer.com/

第一次做了一道有一定难度的SAM题……

考虑每个SAM上的结点x,他的子串表示范围一定是一个区间[Min(x),Max(x)],然后他的Right(x)的大小就是该点所代表的每个子串的出现次数。

那么考虑怎么搞出这个|Right(x)|。我们把每个“实点”(就是在SAM每一次插入后成为last的结点)的点权钦定为1,其他搞成0。然后每个点的|Right(x)|就是x在Right树上的子树的点权和。

然后接下来看上去可以直接做……但是区间chkmax这种黑暗操作,是不是要涉及毒瘤数据结构?

答案是否定的。任何短的子串都是某一个长子串的子串,所以说我们只需要在Max(x)那个地方chkmax,然后搞个后缀最大值即可。

代码:


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter