$SAM$ + 线段树.
- 先建出 $parent$ 树,按照题意,我们只需要处理 $right$ 集合大小为 $1$ 的节点.
 - 如下图,先算出这样的一个节点合法长度的 $max,min$ ( $min$ 可以用 $max(fa)+1$ 计算).
 

- 那么区域 $I$ 内每个点的贡献就是区域 $II$ 的长度加上这个点到区域 $II$ 的距离.
 - 区域 $II$ 内每个点的贡献就是区间 $II$ 的长度.开两颗线段树分别修改就可以了.
 
1  | 
  | 
夢はここに 思い出は遠くに
$SAM$ + 线段树.

1  | #include<bits/stdc++.h>  |