RemoteJudge
又是一道用线段树合并来维护\(endpos\)的题,还有一道见我的博客
思路
先把\(SAM\)建出来
如果两个相邻的串\(s_i\)和\(s_{i+1}\)要满足\(s_i\)在\(s_{i+1}\)中至少出现了两次,那么\(s_i\)显然是\(s_{i+1}\)对应的结点在\(parent\ tree\)上的祖先,那么我们可以在\(parent\ tree\)上树形dp来得出答案
转移自顶向下进行,\(s_i\)在\(s_{i+1}\)中至少出现了两次意味着\(s_i\)在\(s_{i+1}\)的所有\(endpos\)位置都出现了两次,所以我们只需要知道\(s_{i+1}\)的\(endpos\)中任意一个元素并结合线段树来判断能否从\(s_i\)向\(s_{i+1}\)转移。我直接维护了一个\(firstpos\)代表\(endpos\)中的最小值
最后注意不能转移时需要把值继承过来
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include