字符串专题 #1

字符串专题 #1

Problem A. P6640 [BJOI2020] 封印

答案即为 \(\max_{i\in[L,R],j\in[1,m]}\{\min({\rm LCP}(s[i:n],t[j:m]),R-i+1)\}\)

先对于每个 \(i\) 求出 \(\max({\rm LCP}(s[i:n],t[j:m]))\)。我们可以先把 \(s,t\) 接在一起,用分隔符隔开,然后用 SA 求解。

\(R-i+1\)\(\min\),这部分用扫描线+线段树维护。

Problem B. P1117 [NOI2016] 优秀的拆分

\(f_i\)\(i\) 开头的 AA 串个数,\(g_i\)\(i\) 结尾的 AA 串个数,答案即为 \(\sum g_if_{i+1}\)

\(f_i\) 写出来,\(f_i=\sum_k [{\rm LCP}(s[i:n],s[i+k]:n)\ge k]\)

枚举 \(i\) 不好做,所以我们枚举 \(k\)

厉害的来了,\(k\) 的倍数的位置设为关键点,一个 AA 串经过且仅经过两个关键点。枚举相邻两个关键点 \(i,j\),计数穿过它们的 AA 串个数。

一个 AA 串若要穿过 \(i,j\),那么 \({\rm LCP}(s[i:n],s[j:n])\)\({\rm LCS(s[1:i],t[1:j])}\) 都要不短于某个值。

所以我们求出 \(p={\rm LCP}(s[i:n],s[j:n]),q={\rm LCS(s[1:i],t[1:j])}\)。如果 \(p+q<k-1\),那么一定没有合法 AA 串;否则起点在 \([i-q+1,i+p-k]\) 中(也就是终点在 \([j-q+k,j+p-1]\) 中)的长度为 \(2k\) 的串都是 AA 串。差分维护。

总复杂度 \(O(n\ln n)\)

posted @ 2026-01-29 11:44  XP3301_Pipi  阅读(0)  评论(0)    收藏  举报
Title