【题解】P6640 [BJOI2020] 封印 记录
思路1
s[l,r] 与 t 的最长公共子串转化为 s[l,l],s[l,l+1],...,s[l,r] 的最长后缀是 t 的子串。
在 SAM 当中,我们可以直接预处理出来 a[i] 表示 s[1,i] 与 t 的最长公共后缀。
所以就是询问 min(min(a[l],1),min(a[l+1],2),min(a[l+2],3),..,min(a[r],r-l+1))
l次数>sqrt(q) O(nsqrt(q))
l次数<sqrt(q) O(sqrt(q)*n*n)
直接伪掉!
思路2
s[l,r] 与 t 的最长公共子串转化为 s[l,l],s[l,l+1],...,s[l,r] 的最长后缀是 t 的子串。
在 SAM 当中,我们可以直接预处理出来 a[i] 表示 s[1,i] 最长后缀是 t 的子串。
所以就是询问 max(min(a[l],1),min(a[l+1]-1,1)+1,min(a[l+2]-2,1)+2,..,min(a[r]-(r-l),1)+r-l)
重新分析发现 a[l]>=a[l+1]-1>=a[l+2]-2,而第二个元素始终为 1。
二分出来一个位置 x 使得其刚好等于 1。
前面的最大值就是 x-l+1,后面的最大值就是询问 a[x+1...r] 的最大值。
AC!