当前位置: 首页 > 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.jsqmd.com/news/21230/

相关文章:

  • 自动机
  • 1024程序员节福利!参与互动,5分钟赢好礼!
  • 马拉车
  • 具身智能/智能体 定义
  • 【数据挖掘】基于随机森林回归模型的二手车价格预测分析(信息集+源码)
  • 实用指南:flink批处理-水位线
  • 字符串模式匹配算法 KMP
  • Z函数(扩展 KMP)
  • 常用例题
  • 实验报告3
  • 2025年环评公司权威推荐排行榜,环评手续,环评报告,环评验收,专业高效服务助力企业合规发展
  • 2025年棒球帽厂家推荐排行榜,运动棒球帽,时尚棒球帽,定制棒球帽,防晒棒球帽公司精选榜单
  • 常见结论与例题
  • 单芯片方案分享-CH336F-USB拓展坞+百兆网卡+读卡器+100W快充芯片
  • 于状压的线性 RMQ 算法
  • Flink编程模型 - 详解
  • 工业4.0下的边缘存储设计:材料就地处理,响应更快更安全
  • 服务器关机用halt、poweroff还是shutdown -h now?一文帮你说明
  • KD Tree
  • 小波矩阵树:高效静态区间第 K 大查询
  • Seata用法
  • Day3多媒体标签——视频与音频
  • 分数运算类
  • 坐标压缩与离散化
  • 撸一个功能强大的基于语义的图像检索系统
  • 提交一张 PPT,参与 RTE2025 全球语音智能体云展示
  • 完整教程:深入解析AppCrawler:开源自动遍历测试工具配置指南
  • 解释 EIP-4337
  • 数论常见结论及例题
  • 材料包含与下载漏洞