si-shi-yi-d
四十一(D)
最小生成树,考虑将边权排序。然后每次暴力加边,判断是否已经联通,这样复杂度是 \(\Theta(n^2)\)。
考虑 P1117 之法,对于当前边对应的长度 \(len\),将序列上 \(len\) 的倍数的下标设为关键点。
那么一个形如 \(AA\) 的串必定经过恰好两个关键点。枚举每一组相邻的关键点 \(x=i\times len,y=(i+1)\times len\)。
求出前缀 \(x,y\) 的 LCS \(l_1\),后缀 \(x,y\) 的 LCP \(l_2\)。那么若有一个 \(AA\) 经过这两个关键点则必定有 \(l_1+l_2-1\ge len\)。
且,此时左端点在 \([x-l_1+1,x+l_2-1]\) 内,长度为 \(2len\) 的 \(S\) 都满足条件。
现在要做的就是对于 \(i\in[x-l_1+1,x+l_2-1]\),合并 \(i\) 和 \(i+len\) 这两个点。
即要合并区间 \([x-l_1+1,x+l_2-1],[y-l_1+1,y+l_2-1]\)。
直接合并当然不行,考虑 P3295 的方法,用 st 表类似的方法合并区间。
具体地,可以将要合并的区间拆成 \(\log\) 个,每个对应合并。
如果在当前层这两个区间已经合并就返回,否则合并这一层的这两个区间,递归下去下一层分别合并四个区间。
递归到底部的时候计算贡献。复杂度的话容易发现一开始有 \(n\log n\) 的联通块,每次递归会减少一个连通块。
用并查集实现,复杂度为 \(\Theta(n\log n\alpha(n))\)。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号