题目传送门
分析:
对于每一个左端点\(l\),我们都能找到一个\(r\),使得\(l \leq j \leq r\)的\(S_{l,j}\)为\(T\)的子串,\(j \geq r\)的\(S_{l,j}\)不为\(T\)的子串
当\(l\)增大时,对应的\(r\)单调不降,尝试求出每一个\(l\)对应的\(r\)
考虑建一个SAM,目前的\(S_{l,r}\)对应的子串所在节点为\(p\),\(r\)加一位,相当于沿着字符转移边跳一步
如果目前节点子串集合最短长度(即父亲的\(len\)加一)大于了\(r-l+1\),则\(p\)往后缀树上的父亲跳一步
复杂度是\(O(n)\)的
找到了每一个位置\(i\)对应的\(r_i\),考虑询问\(L,R\)
需要分\(r_i \leq R\)和\(r_i>R\)分类讨论
我们对询问离线,两种情况分两棵线段树,单点修改区间取最大值可以简单维护
#include
#include
#include
#include
#include
#include
#include
#include