【A】字符串

记录一些值得记录的东西。

CF917E Upside Down

点分治,然后每个链在正反 kmp 自动机上匹配一下,找到两个链的最大匹配的 \(s_k\) 的前后缀,跨链的贡献是在两个 fail 链上找到一对点长度和为 \(|s_k|\)
离线下来,对每个 \(k\) 做一次:在第一个 fail 树上 dfs,然后在第二棵树上进行点加链求和。

P5576 [CmdOI2019] 口头禅

建立 GSAM,考虑每个节点在哪些串中出现,可以使用启发式合并一类的东西处理。提取每个节点上第一次出现的连续段,然后做二维偏序处理询问。
时间复杂度 \(O(n\log^2 n)\)

CF786D Rap God

点分治,考虑 \(x\) 出发的跨过重心的路径。
如果 \(x\to t\) 字典序已经小于 \(x\to y\) 并且不是 \(x\to y\) 的前缀,那就可以直接统计。
否则就是统计有多少 \(t\to z\) 的路径,满足 \(\mathrm{jump}(x,\mathrm{dis}(x,t))\to y\) 的路径字典序大于他。
可以将询问串和给定串排序,比较可以通过二分哈希。
这样时间复杂度 \(O(n\log ^3 n)\),能过。

怀疑 \(O(nq)\) 都过了。

CF1098F Ж-function

转后缀关系,需要求 \(\sum_{i=l}^r \min(i-(l-1),len_{\mathrm{LCA}(a_i,a_r)})\)
考虑 \(\mathrm{LCA}\) 其实是路径信息:路径上 \(dep\) 最小的节点。点分治:

  • \(a_i,a_r\) 都在 \(t\) 子树内:那么 \(len_{\mathrm{LCA}(a_i,a_r)}=len_{t}\),容易统计。
  • \(a_i\) 不在 \(t\) 子树内,\(a_r\)\(t\) 子树内:\(len_{\mathrm{LCA}(a_i,a_r)}=len_{\mathrm{LCA}(a_i,t)}\),那么 \(\min\) 取左侧显然有一个 \(l\) 的最小值,可以跑二维偏序。
  • \(a_i\)\(t\) 子树内,\(a_r\) 不在 \(t\) 子树内:\(len_{\mathrm{LCA}(a_i,a_r)}=len_{\mathrm{LCA}(a_r,t)}\),也可以跑二维偏序。

时间复杂度 \(O(n\log ^2 n)\)

P6793 [SNOI2020] 字符串

就是将这些串两两匹配,然后代价就是 \(k-\mathrm{LCP}(a,b)\)
把串翻转变成 \(dep_\mathrm{LCA}(u,v)\),那其实是不是就是贪心合并就好了。

CF1081H Palindromic Magic

CF2164H PalindromePalindrome

基本子串字典

回答区间 border。

  • 长度在 \((x,2x]\) 内的 border 构成一个等差数列。
  • 一个串的所有 border 可以划分为 $\log $ 个等差数列。
  • 强周期引理:\(p,q\) 是周期,若满足 \(p+q \le |s|+\gcd(p,q)\),则 \(\gcd(p,q)\) 也是周期。
  • 对于字符串 \(u,v\) 满足 \(2|u|\ge |v|\),则 \(u\)\(v\) 中的出现位置构成等差数列。
    • \(u\)\(v\) 中出现了至少 3 次,则该出现位置公差为 \(u\) 的一个周期。

考虑计算长度在 \((2^k,2^{k+1}]\) 内的 border。
\(u=s_{[l,l+2^{k+1})},u_0=s_{[l,l+2^{k})},v=s_{(r-2^{k+1},r]},v_0=s_{(r-2^k,r]}\)
\(S_1\) 表示 \(v_0\)\(u\) 中的出现位置,\(S_2\) 表示 \(u_0\)\(v\) 中的出现位置。那么一个 border 对应了一个 \(S_1\) 中的元素和 \(S_2\) 中的元素。

考虑对 \(S_1\)\(S_2\) 求交。
对于 \(\min(|S_1|,|S_2|)\le 2\) 容易处理。
对于剩下的情况,\(S_1\) 的公差是 \(v_0\) 的周期,\(S_2\) 的公差是 \(u_0\) 的周期。这时候有公差相等。可以通过弱周期引理证明。

\(S_1,S_2\) 怎么求。
\(N_k(i)\) 表示字符串 \(s_{[i,i+2^k)}\) 在所有 \(i\) 中的排名。也就是后缀数组做 \(k\) 轮后的 \(rk_i\)。注意相同的字符串 rk 必须相等。
考虑求出 \(v_0\) 的第一次在 \(u\) 中出现位置,最后一次出现位置,出现次数。
离线处理。对每个 rk 值做一次滑动窗口。

QOJ3277 扑克比大小

P8006 String Rearrangement in Phantom

P4482 [BJWC2018] Border 的四种求法

板子。

CF1043G Speckled Band

QOJ4882 String Strange Sum

Lyndon 分解

  • Lyndon Word:\(s\) 严格小于自己的所有非平凡后缀。
    等价定义:\(s\) 严格小于所有非平凡循环位移。
  • Lyndon 分解:\(s=w_1+w_2+w_3+\cdots+w_k\),每个 \(w_i\) 都是 Lyndon Word,且 \(w_i\ge w_{i-1}\)
  • Lyndon 没有 border。
  • \(b\) 是 Lyndon Word,则 \(a<b\Rightarrow ab<b\)
  • \(a,b\) 都是 Lyndon Word,且 \(a<b\),则 \(ab\) 还是 Lyndon Word。
  • Lyndon 分解唯一。

Duval 算法:
维护 \(s=s_1+s_2+s_3\),其中 \(s_1\) 是已经分解好的前缀,\(s_2\) 是一个近似 Lyndon Word,\(s_3\) 待分解。
近似 Lyndon Word:\(wwww\cdots \overline w\),其中 \(w\) 是 Lyndon Word,\(\overline w\)\(w\) 的一个前缀。
\(i\) 表示 \(s_2\) 的开头下标,\(j\) 表示 \(s_3\) 的开头下标,\(k\) 表示 \(j-|w|\)

for(int i=1,j=2,k=1;i<=n;)
{
	if(s[j]==s[k]) j++,k++;
	else if(s[j]>s[k]) j++,k=i;
	else
	{
		while(i<=k) i+=j-k,ans.push_back(i-1);
		j=i+1,k=i;
	}
}

P5211 [ZJOI2017] 字符串

https://www.luogu.com.cn/article/q7norbrr
维护潜在最小后缀。

P6629 [ZJOI2020] 字符串

区间本质不同平方串个数。
对于每个 run,考虑其 \(2kp\) 长度的子串,我们维护他的最后一次出现。
其实就是一个斜线加和斜线减。然后你 \(k\) 不超过 runs 的指数。
在一个就是注意两个 run 的一个周期可能是相同的,大概可以哈希,每次查一下前面的贡献。
维护数据结构支持:斜线加减,矩形查询。
把斜线差分成向右上发射的射线,矩形差分成 \(x\le X,y\le Y\)
然后就是按照斜线的初始坐标的 \(y-x\) 排序跑扫描线,分别处理穿过矩形上边界和右边界的情况。
复杂度 \(O(n\log^2 n)\)

posted @ 2026-08-02 08:38  TallBanana  阅读(4)  评论(0)    收藏  举报