[TyvjP1515] 子串统计 [luoguP2408] 不同子串个数(后缀数组)


Tyvj传送门

luogu传送门

经典题

统计一个字符串中不同子串的个数

一个字符串中的所有子串就是所有后缀的前缀

先求出后缀数组,求出后缀数组中相邻两后缀的 lcp

那么按照后缀数组中的顺序遍历求解

每一个后缀 suffix(sa[i]) 对于答案的贡献为 len sa[i] height[i]

len sa[i] 为当前后缀的长度,也就是当前后缀所有前缀的个数(字符串从 0 开始)

height[i] 就是相邻两后缀 lcp,因为有可能会有相同前缀,而相同前缀在前面已经计算过了

为什么只需要 height 数组,而不用把任意两后缀的 lcp 求出来呢?

因为所有后缀已经按照字典序排序了,也就是说,sa[i] 和 sa[i 1] 的 lcp 即为 sa[i] 和 sa[0 ~ i 1] 的所有 lcp 的最大值。

——代码(Tyvj)

1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 200001 5 #define LL long long 6 7 LL ans; 8 int len, m = 256; 9 int buc[N], x[N], y[N], sa[N], rank[N], height[N]; 10 char s[N]; 11 12 inline void build_sa() 13 35 } 36 37 inline void build_height() 38 49 } 50 51 int main() 52 61 build_sa(); 62 build_height(); for(i = 0; i < len; i++) ans += (LL)(len sa[i] height[i]); 64 printf("%lld\n", ans); 65 return 0; 66 }
View Code

洛谷那题好像数据有点问题。



上一篇:[CODEVS1915] 分配问题(最小费用最大流)

下一篇:[POJ1611]The Suspects(并查集)


后缀数组
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图