题目描述
在编写完论文《Faster Algorithms for Internal Dictionary Queries》后,小青鱼与奇异强子决定编写如下的题目。
令 lcp(s,t) 表示字符串 s=s1s2…sn 与 t=t1t2…tm 的最长公共前缀,也就是最大的整数 k 满足 0≤k≤min(n,m) 且 s1s2…sk 等于 t1t2…tk。
小青鱼给了您一个非空的字符串 s=s1s2…sn。令 $f(s)=\sum\limits_{i=1}^{n} \text{lcp}(s, \text{suf}(s, i))$,其中 suf(s,i) 表示 s 从 si 开始的后缀(即 suf(s,i)=sisi+1…sn)。请注意在本题中,字母表中包含了 n 种字母,而不是仅有 26 种。
对每个 i=1,2,⋯,n,您需要回答如下询问:如果您必须将 si 修改为另一个不同的字符 c(c=si),请选择最优的字符 c 并计算 f(s(i)) 的最大值,其中 s(i)=s1…si−1csi+1…sn。
输入格式
有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据:
第一行输入一个整数 n(2≤n≤2×105)表示字符串的长度。
第二行输入 n 个整数 s1,s2,…,sn(1≤si≤n),其中 si 表示字符串的第 i 个字符是字母表中第 si 个字母。
保证所有数据 n 之和不超过 2×105。
输出格式
令 m(i) 表示 f(s(i)) 的最大值。为了减少输出的大小,对于每组测试数据输出一行一个整数表示 i=1∑n(m(i)⊕i),其中 ⊕ 是按位异或运算符。
2
4
2 1 1 2
12
1 1 4 5 1 4 1 9 1 9 8 10
15
217
提示
对于第一组样例数据,我们首先计算 m(1) 的值。
- 如果将 s1 修改为 1,那么 f(s(1))=4+2+1+0=7。
- 如果将 s1 修改为 3 或 4,那么 f(s(1))=4+0+0+0=4。
因此 m(1)=7。
类似地,m(2)=6,m(3)=6 以及 m(4)=4。所以答案为 $(7 \oplus 1) + (6 \oplus 2) + (6 \oplus 3) + (4 \oplus 4) = 15$。