給字符串 s (長 n ≤ 1000),求有多少**不同的非空子串**在 s 中**至少出現兩次**(不重疊?題目為「至少兩次」,允許重疊)。輸出滿足條件的不同子串數量。多測試案例。
// 後綴數組構建 (倍增法 O(n log n))
// height 計算 (Kasai O(n))
ll ans = 0;
for (int L = 1; L <= n; ++L) {
int cnt = 0;
for (int i = 1; i <= n; ++i) {
if (height[i] >= L) {
if (cnt == 0) ans++; // 新區間開始
cnt++;
} else {
cnt = 0;
}
}
}
printf("%lld\n", ans);
HDU 3518 是「後綴數組統計重複子串」的基礎應用。枚舉長度 + 掃描 height 區間是直觀做法,n≤1000 時 O(n²) 完全可行。掌握 SA 構建與 height 含義,即可解決大多數子串統計問題。