【题解】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!

posted @ 2025-02-19 19:03  GuTongXing  阅读(10)  评论(0)    收藏  举报