字符串专题 #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)\)。

浙公网安备 33010602011771号