#P16315. [ICPC 2023 Jinan R] 基本子串结构

    ID: 18251 远端评测题 1000ms 1024MiB 尝试: 0 已通过: 0 难度: 8 上传者: 标签>字符串2023哈希 hashingICPC济南Z 函数

[ICPC 2023 Jinan R] 基本子串结构

题目描述

在编写完论文《Faster Algorithms for Internal Dictionary Queries》后,小青鱼与奇异强子决定编写如下的题目。

lcp(s,t)\text{lcp}(s,t) 表示字符串 s=s1s2sns = s_1 s_2 \dots s_nt=t1t2tmt = t_1 t_2 \dots t_m 的最长公共前缀,也就是最大的整数 kk 满足 0kmin(n,m)0 \le k \le \min(n,m)s1s2sks_1 s_2 \dots s_k 等于 t1t2tkt_1 t_2 \dots t_k

小青鱼给了您一个非空的字符串 s=s1s2sns=s_1 s_2 \dots s_n。令 $f(s)=\sum\limits_{i=1}^{n} \text{lcp}(s, \text{suf}(s, i))$,其中 suf(s,i)\text{suf}(s, i) 表示 sssis_i 开始的后缀(即 suf(s,i)=sisi+1sn\text{suf}(s, i) = s_i s_{i+1} \dots s_n)。请注意在本题中,字母表中包含了 nn 种字母,而不是仅有 2626 种。

对每个 i=1,2,,ni = 1, 2, \cdots, n,您需要回答如下询问:如果您必须将 sis_i 修改为另一个不同的字符 cccsic \ne s_i),请选择最优的字符 cc 并计算 f(s(i))f(s^{(i)}) 的最大值,其中 s(i)=s1si1csi+1sns^{(i)}=s_1 \dots s_{i-1} c s_{i+1} \dots s_n

输入格式

有多组测试数据。第一行输入一个整数 TT 表示测试数据组数,对于每组测试数据:

第一行输入一个整数 nn2n2×1052 \le n \le 2 \times 10^5)表示字符串的长度。

第二行输入 nn 个整数 s1,s2,,sns_1,s_2,\dots,s_n1sin1 \le s_i \le n),其中 sis_i 表示字符串的第 ii 个字符是字母表中第 sis_i 个字母。

保证所有数据 nn 之和不超过 2×1052 \times 10^5

输出格式

m(i)m(i) 表示 f(s(i))f(s^{(i)}) 的最大值。为了减少输出的大小,对于每组测试数据输出一行一个整数表示 i=1n(m(i)i)\sum\limits_{i=1}^{n} (m(i) \oplus i),其中 \oplus 是按位异或运算符。

2
4
2 1 1 2
12
1 1 4 5 1 4 1 9 1 9 8 10
15
217

提示

对于第一组样例数据,我们首先计算 m(1)m(1) 的值。

  • 如果将 s1s_1 修改为 11,那么 f(s(1))=4+2+1+0=7f(s^{(1)}) = 4 + 2 + 1 + 0 = 7
  • 如果将 s1s_1 修改为 3344,那么 f(s(1))=4+0+0+0=4f(s^{(1)}) = 4 + 0 + 0 + 0 = 4

因此 m(1)=7m(1) = 7

类似地,m(2)=6m(2) = 6m(3)=6m(3) = 6 以及 m(4)=4m(4) = 4。所以答案为 $(7 \oplus 1) + (6 \oplus 2) + (6 \oplus 3) + (4 \oplus 4) = 15$。