摘要: 对多串建立SAM的一种方法是加分隔符。于是加完分隔符建出SAM。 考虑统计出每个节点被多少个串包含。让每个串各自在SAM上跑,跑到一个节点就标记(显然一定会完全匹配该节点,因为是对包含其的串建的SAM)并暴跳fail,遇到已经被该串标记过的点就停止。 这样暴力的复杂度容易感性证明是O(Lsqrt(L 阅读全文
posted @ 2019-05-06 23:41 Gloid 阅读(450) 评论(0) 推荐(0)
摘要: 先考虑没有动态加字符怎么做。计算每个节点的贡献,当|right|>=k时将len-lenfa计入即可。 动态加字符后,这个东西难以用LCT维护。于是考虑离线。建完SAM后,容易发现每个节点在时间上的一段后缀提供贡献,且具体时间就是其right集合中的第k小。主席树或线段树合并求出即可。 阅读全文
posted @ 2019-05-06 20:00 Gloid 阅读(220) 评论(0) 推荐(0)
摘要: 询问串放在SAM上不跳fail跑到的节点的|right|即为答案。用LCT维护parent树即可。可以直接维护子树信息,也可以转化为路径加。注意强制在线所使用的mask是作为参数传进去的。 阅读全文
posted @ 2019-05-06 16:45 Gloid 阅读(174) 评论(0) 推荐(0)
摘要: 先考虑l=1,r=n,并且不要求本质不同的情况。对原串建SAM,将询问串在上面跑,得到每个前缀的最长匹配后缀即可得到答案。 然后考虑本质不同。对询问串也建SAM,统计每个节点的贡献,得到该点right集合中任意一个的匹配长度即可。 然后考虑原问题。我们需要求的仍然只是每个前缀的最长匹配后缀。通过线段 阅读全文
posted @ 2019-05-06 13:39 Gloid 阅读(227) 评论(0) 推荐(0)