UOJ #889. 【UNR #8】二维抄袭检测
首先你需要会 \(n=2\) 时候的贪心,这个比较简单,直接能走就走就行了。
然后 \(n=3\) 的时候就不能能走就走了,可能在中间就拐到第三行了。但是容易发现的是我们只会在最后一个能走到第三行的位置走到第三行。我们需要找到这个位置。一个比较重要的观察是,如果其后面匹配长度大于 \(3\),则是否能走到第三行是确定的,否则暴力即可。\(n=4\) 同样也是类似的。
\(n\) 更大以后的路径形态会比较复杂,不好贪心。考虑 DP,我们对于每条斜线进行 DP,记 \(f_i\) 为这条斜线在第 \(i\) 行能否匹配。
直接硬要转移是在一个 DFA 上跑匹配,需要 DAG 链剖分。但是根据我们上面的观察,记 \(f_i\) 中第一个 \(1\) 为 \(x\),则我们求出 \(x\) 往后最多能匹配到哪里,那么这一段的转移是确定的,最后一个位置不确定,但是可以暴力转移,之后 \(x\) 至少 \(+1\)。
因此对于每个询问,我们会进行 \(n\) 轮操作,每一轮操作中需要求一次 LCP 以及一次矩阵连乘积,还有一次暴力转移。压位加上猫树即可做到 \(O(L\log L+n^3m\log m+qn^2)\)。