当前位置: 首页 > 网络知识

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

时间:2026-01-29 09:37:53

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

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



上一篇:[luoguP2762] 太空飞行计划问题(最大权闭合图—最小割—最大流)
下一篇:[luoguP2761] 软件补丁问题(状压最短路)
后缀数组
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素