又是一道\(SAM\)维护\(endpos\)集合的题,我直接把的板子粘过来了QwQ
思路
如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了。因为要求的是字典序比\(T\)大且最小的子串,我们从前到后让尽可能多的位相等,如果再也无法相等了就从后往前找一位变大。
但是每次询问会给我们一个可行区间\([l,r]\),而我们又显然不能直接把对应区间的\(SAM\)建出来,否则复杂度会\(GG\)。
仔细想一下,其实我们并不需要知道\([l,r]\)区间对应的\(SAM\),只要知道能否向某一个结点转移就行了。这个我们可以用\(endpos\)集合来判断。具体一下,就是当前已经考虑了\(i\)个字符且在结点\(u\),现在需要判断能否转移到\(v\),只需要判断\(u\)是否有到\(v\)的转移边和\(v\)结点的\(endpos\)是否有元素在\([l+i-1,r]\)中就行了
\(endpos\)拿线段树合并维护一下就行了(也可以用树上主席树搞一下)
其实本菜鸡来学这个套路完全是为写你的名字做铺垫的
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include