题目大意
求一个字符串不同子串的个数。
解题思路
后缀数组和高度数组的应用!
因为每个子串都是每个后缀的前缀,那么原问题等价于求所有后缀之间不相同的前缀的个数如果后缀按照sa[1],sa[2]….sa[n]这样的顺序来计算的,那么不难发现每次增加的子串的个数为n-sa[i]+1,但是其中是有height[i]个和前面字符串的前缀相同的,所以对应于每个sa[i]对整个字符串不同子串的数量贡献n-sa[i]+1-height[i]
所以原问题就转换为了这个公式n-sa[i]+1-height[i]
的累加。
AC代码
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>