我用的是一个 hash+KMP 的做法。 首先,先把所有后缀的 hash 值记录下来,存入 map 中。 然后查询每一个前缀,求出 hash 值相同的后缀数量乘上长度的和即为答案。 但有些情况会算重复,比如 ababa 中 a 的答案在 aba 处被多算了,aba 的答案在 ababa 的地方被多算了。 其实,多算的位置就是自己的与自己匹配,就是 KMP 的 next 数组。 求出 next 即可。 hash 时注意多加一些值,比如长度。 #include<bits/stdc++.h> #define re //register #define int long long usin...