当前位置: 首页 > news >正文

后缀数组 SA

后缀数组 SA

\(\mathcal O(N)\) 的复杂度求解。

struct SuffixArray {int n;vector<int> sa, rk, lc;SuffixArray(const string &s) {n = s.length();sa.resize(n);lc.resize(n - 1);rk.resize(n);iota(sa.begin(), sa.end(), 0);sort(sa.begin(), sa.end(), [&](int a, int b) { return s[a] < s[b]; });rk[sa[0]] = 0;for (int i = 1; i < n; ++i) {rk[sa[i]] = rk[sa[i - 1]] + (s[sa[i]] != s[sa[i - 1]]);}int k = 1;vector<int> tmp, cnt(n);tmp.reserve(n);while (rk[sa[n - 1]] < n - 1) {tmp.clear();for (int i = 0; i < k; ++i) {tmp.push_back(n - k + i);}for (auto i : sa) {if (i >= k) {tmp.push_back(i - k);}}fill(cnt.begin(), cnt.end(), 0);for (int i = 0; i < n; ++i) {++cnt[rk[i]];}for (int i = 1; i < n; ++i) {cnt[i] += cnt[i - 1];}for (int i = n - 1; i >= 0; --i) {sa[--cnt[rk[tmp[i]]]] = tmp[i];}swap(rk, tmp);rk[sa[0]] = 0;for (int i = 1; i < n; ++i) {rk[sa[i]] = rk[sa[i - 1]] + (tmp[sa[i - 1]] < tmp[sa[i]] || sa[i - 1] + k == n ||tmp[sa[i - 1] + k] < tmp[sa[i] + k]);}k *= 2;}for (int i = 0, j = 0; i < n; ++i) {if (rk[i] == 0) {j = 0;continue;}for (j -= j > 0;i + j < n && sa[rk[i] - 1] + j < n && s[i + j] == s[sa[rk[i] - 1] + j];) {++j;}lc[rk[i] - 1] = j;}}
};
http://www.zskr.cn/news/29256.html

相关文章:

  • 边缘计算与AI:移动端设计软件的实时性能突破 - 教程
  • 字符串模式匹配算法 KMP
  • Flink编程模型 - 详解
  • 工业4.0下的边缘存储设计:材料就地处理,响应更快更安全
  • 服务器关机用halt、poweroff还是shutdown -h now?一文帮你说明
  • Min25 筛
  • 完整教程:微软2025教育AI报告:教育群体采用AI的比例显著提升
  • 康拓展开
  • git回滚代码
  • 离散对数 bsgs 与 exbsgs
  • 【LTDC】LTDC 简介
  • 分类器案例 - -一叶知秋
  • 最大流
  • 最长路(topsort+DP算法)
  • 缩点(Tarjan 算法)
  • 常见概念
  • CNCF项目记录2025-10
  • 代理
  • 双碳目标下,MyEMS 为何成为制造企业的 “刚需工具”?
  • 树上路径交
  • 点分治 / 树的重心
  • 树论大封装(直径+重心+中心)
  • 书评-谋杀黄昏
  • 徐州信息技术服务管理体系认证渠道口碑榜:聚焦机构资质、服务案例及合规性评估
  • 完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用
  • 附加数据文件失败:操作系统错误 5:“5(拒绝访问。)”。 CREATE DATABASE 失败。无法创建列出的某些文件名
  • 20251024- 使用shell脚本分库定时备份MySQL数据
  • 2025年口碑好的食品级贴体盒,榴莲贴体盒实力源头
  • 2025年诚信的液压水渠成型机,全自动水渠成型机厂家最新权威推荐榜
  • 2025年10月扬州公考面试机构全景解析报告,基于专业测评的技术、性能及市场优势深度分析