0初始化:t 首尾及每两字符间插入 '#',得到 # a # b # a # c # a # b # a #;t[0]='&'、t[16]='$' 作哨兵。id = 0, mx = 0,p 数组待填。
1i = 1:i ≥ mx(1 ≥ 0),只能从 p[1] = 1 开始。t[0]='&' 与 t[2]='a' 不等 → p[1] = 1。此时 i + p[1] = 2 > 0,更新 id = 1, mx = 2。
2i = 2:i ≥ mx(2 ≥ 2),无镜像可用。从 p = 1 向外扩:t[1]='#' 与 t[3]='#' 相等 → p = 2;再比 t[0] 与 t[4],越界侧是哨兵 → 停。故 p[2] = 2(对应原串 "a")。i + p = 4 > 2 → id = 2, mx = 4。
3i = 3:i < mx(3 < 4)。镜像 j = 2·2 − 3 = 1,p[j] = 1,mx − i = 1 → p[3] = min(1,1) = 1。扩展:t[2]='a' 与 t[4]='b' 不等 → 保持 1。i + p = 4 不大于 mx,不更新。
4i = 4:i ≥ mx(4 ≥ 4)。从 p = 1 扩:t[3]=t[5]='#' ✓ → 2;t[2]=t[6]='a' ✓ → 3;t[1]=t[7]='#' ✓ → 4;t[0]='&' vs t[8]='c' ✗ → 停。p[4] = 4(对应原串 "aba")。i + p = 8 > 4 → id = 4, mx = 8。
5i = 5:i < 8。j = 2·4 − 5 = 3,p[3] = 1,mx − i = 3 → p[5] = 1。扩展 t[4]='b' vs t[6]='a' ✗ → p[5] = 1。
6i = 6:i < 8。j = 2·4 − 6 = 2,p[2] = 2,mx − i = 2 → p[6] = 2。注意这里 p[j] = mx − i,属于情况 B,要尝试扩展:t[4]='b' vs t[8]='c' ✗ → p[6] = 2。
7i = 7:i < 8。j = 8 − 7 = 1,p[1] = 1,mx − i = 1 → p[7] = 1。扩展 t[6]='a' vs t[8]='c' ✗ → p[7] = 1。
8i = 8:i ≥ mx(8 ≥ 8),无镜像。一路向外扩:t[7]=t[9]='#'、t[6]=t[10]='a'、t[5]=t[11]='#'、t[4]=t[12]='b'、t[3]=t[13]='#'、t[2]=t[14]='a'、t[1]=t[15]='#',全部相等 → p[8] = 8,整个 t 都是回文。i + p = 16 > 8 → id = 8, mx = 16。
9i = 9:i < 16。j = 2·8 − 9 = 7,p[7] = 1,mx − i = 7 → p[9] = 1。扩展 t[8]='c' vs t[10]='a' ✗ → p[9] = 1。
10i = 10:j = 16 − 10 = 6,p[6] = 2,mx − i = 6 → p[10] = 2。扩展 t[8]='c' vs t[12]='b' ✗ → p[10] = 2。
11i = 11:j = 5,p[5] = 1 → p[11] = 1。扩展失败。
12i = 12:j = 16 − 12 = 4,p[4] = 4,mx − i = 4 → p[12] = min(4,4) = 4。这就是「照镜子」最漂亮的一步:一次字符比较都没做,就拿到了半径 4(对应原串位置 5..7 的 "aba")。尝试再扩:t[8]='c' 与 t[16]='$' 不等 → 保持 4。
13i = 13, 14, 15:依次得 p[13] = 1、p[14] = 2、p[15] = 1。扫描结束。
14汇总:p = [_,1,2,1,4,1,2,1,8,1,2,1,4,1,2,1]。最长回文长度 = max(p) − 1 = 7(就是 "abacaba" 本身);回文子串总数 = Σ⌊p[i]/2⌋ = 1+2+1+4+1+2+1 = 12。