給定長度 n 的數列,求差分後有多少子串滿足 ABA 形式,其中 B 長度固定為 m,A 長度 > 0 且兩側 A 相同。
a + [INF] + reverse(a) 並構建後綴數組 SA、Height 數組、RMQ(稀疏表)。L1(向右擴展)和反轉數列中的 LCP L2(向左擴展)。L1 = min(L1, j), L2 = min(L2, j-1)。L1 + L2 >= j,則貢獻 L1 + L2 - j + 1 個合法子串。// 後綴數組構建、Height、RMQ 同標準模板
// 主循環
for (int j = 1; j + j + m <= n; ++j) {
int last = 0;
for (int i = 1; i + j + m <= n; i += j) {
int r = min(LCP(rank[i], rank[i+j+m]), j); // 向右
if (last + r >= j) ans += last + r - j + 1;
last = min(LCP(rank[rev(i+j-1)], rank[rev(i+j+j+m-1)]), j-1); // 向左
}
}
BZOJ 2119 是「後綴數組 + 區間 LCP + 枚舉長度」的高難度綜合題。核心洞察:差分消除絕對值 → ABA 結構轉化為等長公共前綴/後綴 → SA+RMQ 高效查詢。掌握此模板可解決 BZOJ 2119、Codeforces 子串周期性問題。