重复旋律5
链接
题意
给定一个串,求这个串的本质不同的子串个数。
题解
后缀数组
答案就是 $ \sum_{i=1}^{n} n-sa[i]-height[i]+1 $
后缀自动机
题目所求即 $ \sum_{i=1}^{cnt} siz[i] $
按照逆拓扑序递推一遍即可。
核心代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17void calc()
{
int mxval=0;
for(int i=1;i<=cnt;i++)
sum[mx[i]]++,mxval=max(mxval,mx[i]);
for(int i=1;i<=mxval;i++)
sum[i]+=sum[i-1];
for(int i=1;i<=cnt;i++)
tp[sum[mx[i]]--]=i;
for(int i=cnt;i>=1;i--)
{
siz[par[tp[i]]]+=siz[tp[i]];
ans[mx[tp[i]]]=max(ans[mx[tp[i]]],siz[tp[i]]);
}
for(int i=n-1;i>=1;i--)
ans[i]=max(ans[i],ans[i+1]);
}